2018-05-02 11:56:12 +00:00
|
|
|
open Import
|
|
|
|
open Sexp.Of_sexp
|
|
|
|
|
|
|
|
type t =
|
2018-05-02 15:55:18 +00:00
|
|
|
{ name : string
|
|
|
|
; version : string option
|
2018-05-02 11:56:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
let filename = "dune-project"
|
|
|
|
|
|
|
|
type lang =
|
|
|
|
| Dune_0_1
|
|
|
|
|
|
|
|
let lang =
|
2018-05-02 13:58:24 +00:00
|
|
|
let name =
|
|
|
|
enum
|
|
|
|
[ ("dune", ()) ]
|
|
|
|
in
|
2018-05-02 11:56:12 +00:00
|
|
|
let version ver =
|
|
|
|
match string ver with
|
|
|
|
| "0.1" -> Dune_0_1
|
|
|
|
| _ ->
|
|
|
|
of_sexp_error ver "unsupported version of the dune language"
|
|
|
|
in
|
2018-05-02 13:58:24 +00:00
|
|
|
field_multi "lang" (name @> version @> nil) (fun () v -> v)
|
2018-05-02 11:56:12 +00:00
|
|
|
|
2018-05-02 13:58:24 +00:00
|
|
|
let name ~dir =
|
|
|
|
field_o "name" string >>= function
|
|
|
|
| Some s -> return s
|
|
|
|
| None -> return ("_" ^ String.concat ~sep:"_" (Path.explode_exn dir))
|
2018-05-02 11:56:12 +00:00
|
|
|
|
2018-05-02 13:58:24 +00:00
|
|
|
let parse ~dir =
|
|
|
|
record
|
|
|
|
(lang >>= fun Dune_0_1 ->
|
|
|
|
name ~dir >>= fun name ->
|
2018-05-02 15:55:18 +00:00
|
|
|
field_o "version" string >>= fun version ->
|
|
|
|
return { name; version })
|
2018-05-02 11:56:12 +00:00
|
|
|
|
|
|
|
let load ~dir =
|
|
|
|
let fname = Path.relative dir filename in
|
2018-05-02 13:58:24 +00:00
|
|
|
let sexp = Io.Sexp.load_many_as_one fname in
|
|
|
|
parse ~dir sexp
|