Skip to content

Commit 26a242e

Browse files
committed
Standalone utility; OCaml 4.06 + ocaml-migrate-parsetree
1 parent 7d6e1a1 commit 26a242e

9 files changed

+139
-49
lines changed

bin/Extract.re

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
open Migrate_parsetree;
2+
3+
open Ast_mapper;
4+
5+
open Parsetree;
6+
7+
open Lib;
8+
9+
let messages = ref([]);
10+
11+
let mapper = ExtractionMapper.getMapper(message => messages := [message, ...messages^]);
12+
13+
let extractMessages = ast => {
14+
mapper.structure(mapper, Obj.magic(ast)) |> ignore;
15+
let sortedJsonObjects = messages^ |> List.sort(Message.compare) |> List.map(Message.toJson);
16+
Yojson.Basic.pretty_to_channel(stdout, `List(sortedJsonObjects));
17+
print_newline();
18+
};
19+
20+
switch (Ast_io.from_channel(stdin)) {
21+
| Result.Ok((_, Ast_io.Impl((module Version), ast))) =>
22+
module Convert = Convert(Version, OCaml_406);
23+
let converted = Obj.magic(Convert.copy_structure(ast));
24+
extractMessages(converted);
25+
| Result.Ok((_, Ast_io.Intf(_, _))) => print_endline("Intf AST!")
26+
| Result.Error(Not_a_binary_ast(_)) => print_endline("Error: not a binary AST: ")
27+
| Result.Error(Unknown_version(v)) => print_endline("Error: unknown version: " ++ v)
28+
};

bin/Ppx.re

Lines changed: 0 additions & 3 deletions
This file was deleted.

bin/jbuild

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(jbuild_version 1)
22

33
(executable
4-
((name Ppx)
5-
(public_name Ppx)
4+
((name Extract)
5+
(public_name Extract)
66
(libraries (lib))))

esy.lock

Lines changed: 36 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/ExtractIntlMessages.re

Lines changed: 0 additions & 26 deletions
This file was deleted.

lib/ExtractionMapper.re

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
open Ast_mapper;
2+
3+
open Parsetree;
4+
5+
let getLabelString = (key, labels) =>
6+
try (
7+
{
8+
let value = labels |> List.assoc(Asttypes.Labelled(key));
9+
switch (value) {
10+
| {pexp_desc: Pexp_constant(Pconst_string(text, _))} => Some(text)
11+
| _ => None
12+
};
13+
}
14+
) {
15+
| Not_found => None
16+
};
17+
18+
let getMessage = expr =>
19+
switch (expr) {
20+
| {
21+
pexp_desc:
22+
Pexp_apply(
23+
{
24+
pexp_desc: Pexp_ident({txt: Ldot(Ldot(Lident("ReactIntl"), "FormattedMessage"), "createElement"), loc}),
25+
},
26+
labels,
27+
),
28+
} =>
29+
let id = labels |> getLabelString("id");
30+
let defaultMessage = labels |> getLabelString("defaultMessage");
31+
let description = labels |> getLabelString("description");
32+
switch (id, defaultMessage) {
33+
| (Some(id), Some(defaultMessage)) => Some({Message.id, defaultMessage, description})
34+
| _ => None
35+
};
36+
| _ => None
37+
};
38+
39+
let getMapper = callback => {
40+
...default_mapper,
41+
expr: (mapper, expr) => {
42+
switch (getMessage(expr)) {
43+
| Some(message) => callback(message)
44+
| None => ()
45+
};
46+
default_mapper.expr(mapper, expr);
47+
},
48+
};

lib/Message.re

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
type t = {
2+
id: string,
3+
defaultMessage: string,
4+
description: option(string),
5+
};
6+
7+
let compare = (a, b) => compare(a.id, b.id);
8+
9+
let toJson = ({id, defaultMessage, description}) =>
10+
switch (description) {
11+
| Some(description) =>
12+
`Assoc([
13+
("id", `String(id)),
14+
("defaultMessage", `String(defaultMessage)),
15+
("description", `String(description)),
16+
])
17+
| None => `Assoc([("id", `String(id)), ("defaultMessage", `String(defaultMessage))])
18+
};

lib/jbuild

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
((name lib)
55
(flags (-w -40 -w +26))
66
(public_name esy-reason-project)
7-
(libraries (compiler-libs.common))))
7+
(libraries (ocaml-migrate-parsetree yojson))))

package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"name": "esy-reason-project",
2+
"name": "bs-react-intl-extractor",
33
"version": "0.1.0",
4-
"description": "Reason workflow with Esy",
4+
"description": "Message extractor for bs-react-intl",
55
"license": "MIT",
66
"esy": {
77
"build": [["refmterr", "jbuilder", "build"]],
@@ -11,17 +11,19 @@
1111
"dependencies": {
1212
"@esy-ocaml/esy-installer": "^0.0.0",
1313
"@opam/jbuilder": "^1.0.0-beta14",
14+
"@opam/ocaml-migrate-parsetree": "^1.0.10",
1415
"@opam/reason": "^3.0.0",
16+
"@opam/yojson": "^1.4.1",
1517
"refmterr": "^3.0.4"
1618
},
1719
"resolutions": {
1820
"**/@opam/result": "1.2.0"
1921
},
2022
"peerDependencies": {
21-
"ocaml": "~4.2.3"
23+
"ocaml": "~4.6.1"
2224
},
2325
"devDependencies": {
2426
"@esy-ocaml/merlin": "*",
25-
"ocaml": "~4.2.3"
27+
"ocaml": "~4.6.1"
2628
}
2729
}

0 commit comments

Comments
 (0)