Как написать собственный декоратор ppx в рескрипт?
Мне нужно сгенерировать значение с типом, отличным от моего переданного типа. Я впервые пишу на ocaml-подобном, и, например, в знакомом мне haskell я бы использовал Data.Generics. Как я понял, мне нужно использовать декоратор и ppx. Я написал простой пример
let recordHandler = (loc: Location.t, _recFlag: rec_flag, _t: type_declaration, fields: list(label_declaration)) => {
let (module Builder) = Ast_builder.make(loc);
let test = [%str
let schema: Schema = { name: "", _type: String, properties: [] }
]
let moduleExpr = Builder.pmod_structure(test);
[%str
module S = [%m moduleExpr]
]
}
let str_gen = (~loc, ~path as _, (_rec: rec_flag, t: list(type_declaration))) => {
let t = List.hd(t)
switch t.ptype_kind {
| Ptype_record(fields) => recordHandler(loc, _rec, t, fields);
| _ => Location.raise_errorf(~loc, "schema is used only for records.");
};
};
let name = "my_schema";
let () = {
let str_type_decl = Deriving.Generator.make_noarg(str_gen);
Deriving.add(name, ~str_type_decl) |> Deriving.ignore;
};
И
open Ppxlib;
let _ = Driver.run_as_ppx_rewriter()
Но при использовании в коде рескрипта
module User = {
@deriving(my_schema)
type my_typ = {
foo: int,
};
};
Я поймал:
схема не поддерживается
. И я убедился, что правильно подключил его, когда изменил @deriving(my_schema) на @deriving (abcd) и @deriving (sschema). У меня другая ошибка
Ppxlib.Deriving: 'abcd' не является генератором производных типов поддерживаемых типов.
И мой последний эксперимент состоял в том, чтобы скопировать существующие аксессоры, извлекающие из библиотеки. ppx_accessor Я его скопировал-вставил и переименовал в accessors_2. И у меня такая же ошибка, как эксперимент.
accessors_2 не поддерживается
Также я не нашел примеров "ppx rescript". Не могли бы вы мне помочь. Что я делаю не так (ВСЕ, я знаю)
1 ответ
Я нашел ответ в статье
Отказ от поддержки пользовательских PPX, таких как ppx_deriving (атрибут deriving теперь интерпретируется исключительно как bs.deriving)