package spin
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 69let 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