package spin

  1. Overview
  2. Docs

Source file refmt.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
let run ~cwd ~stdout cmd args =
  Logs.debug (fun m -> m "Running \"%s %s\"" cmd (String.concat " " args));
  Spawn.exec cmd args ~stdout ~cwd:(Path cwd)
  |> Result.map_error (fun err ->
         let msg =
           Printf.sprintf
             "an error occured while running \"%s %s\": %s"
             cmd
             (String.concat " " args)
             err
         in
         Spin_error.failed_to_generate msg)

let is_esy_project project_root =
  Sys.file_exists (Filename.concat project_root "esy.json")

let get_refmt_command filename =
  if Filename.check_suffix filename ".ml" then
    Some
      ( [ "refmt"; filename; "--interface=false"; "--parse=ml"; "--print=re" ]
      , Filename.chop_suffix filename ".ml" ^ ".re" )
  else if Filename.check_suffix filename ".mli" then
    Some
      ( [ "refmt"; filename; "--interface=true"; "--parse=ml"; "--print=re" ]
      , Filename.chop_suffix filename ".mli" ^ ".rei" )
  else if Filename.check_suffix filename ".re" then
    Some
      ( [ "refmt"; filename; "--interface=false"; "--parse=re"; "--print=ml" ]
      , Filename.chop_suffix filename ".re" ^ ".ml" )
  else if Filename.check_suffix filename ".rei" then
    Some
      ( [ "refmt"; filename; "--interface=true"; "--parse=re"; "--print=ml" ]
      , Filename.chop_suffix filename ".rei" ^ ".mli" )
  else
    None

let convert_with_esy ~project_root filename =
  match get_refmt_command filename with
  | Some (command, output_filename) ->
    let oc = open_out (Filename.concat project_root output_filename) in
    let res =
      run ~cwd:project_root ~stdout:(Unix.descr_of_out_channel oc) "esy" command
    in
    close_out oc;
    res
  | None ->
    Ok ()

let convert_with_opam ~project_root filename =
  match get_refmt_command filename with
  | Some (command, output_filename) ->
    let oc = open_out (Filename.concat project_root output_filename) in
    let res =
      run
        ~cwd:project_root
        ~stdout:(Unix.descr_of_out_channel oc)
        "opam"
        ([ "exec"; "--" ] @ command)
    in
    close_out oc;
    res
  | None ->
    Ok ()

let convert ~project_root file =
  if is_esy_project project_root then
    convert_with_esy ~project_root file
  else
    convert_with_opam ~project_root file
OCaml

Innovation. Community. Security.