Как написать собственный декоратор 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. Не могли бы вы мне помочь. Что я делаю не так (ВСЕ, я знаю)


person Gleb Patcia    schedule 13.03.2021    source источник
comment
Перекрестно размещено на форуме . rescript-lang.org/t/. Пожалуйста, сообщите, если вы размещаете кросс-посты.   -  person Yawar    schedule 14.03.2021


Ответы (1)


Я нашел ответ в статье

Отказ от поддержки настраиваемых PPX-файлов, таких как ppx_deriving (теперь атрибут производного интерпретируется исключительно как bs.deriving)

person Gleb Patcia    schedule 15.03.2021