mirror of
https://github.com/CatalaLang/catala.git
synced 2024-11-12 21:48:25 +03:00
58 lines
1.9 KiB
OCaml
58 lines
1.9 KiB
OCaml
(* This file is part of the Catala compiler, a specification language for tax
|
|
and social benefits computation rules. Copyright (C) 2022 Inria, OCamlPro;
|
|
contributors: Louis Gesbert <louis.gesbert@ocamlpro.com>
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
use this file except in compliance with the License. You may obtain a copy of
|
|
the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
License for the specific language governing permissions and limitations under
|
|
the License. *)
|
|
|
|
type 'ast gen = {
|
|
name : string;
|
|
extension : string;
|
|
apply : string option -> 'ast -> Scopelang.Dependency.TVertex.t list -> unit;
|
|
}
|
|
|
|
type t = Lcalc of Lcalc.Ast.program gen | Scalc of Scalc.Ast.program gen
|
|
|
|
let name = function Lcalc { name; _ } | Scalc { name; _ } -> name
|
|
let backend_plugins : (string, t) Hashtbl.t = Hashtbl.create 17
|
|
|
|
let register t =
|
|
Hashtbl.replace backend_plugins (String.lowercase_ascii (name t)) t
|
|
|
|
module PluginAPI = struct
|
|
let register_lcalc ~name ~extension apply =
|
|
register (Lcalc { name; extension; apply })
|
|
|
|
let register_scalc ~name ~extension apply =
|
|
register (Scalc { name; extension; apply })
|
|
end
|
|
|
|
let find name = Hashtbl.find backend_plugins (String.lowercase_ascii name)
|
|
|
|
let load_file f =
|
|
try
|
|
Dynlink.loadfile f;
|
|
Utils.Cli.debug_print "Plugin %S loaded" f
|
|
with e ->
|
|
Utils.Errors.format_warning "Could not load plugin %S: %s" f
|
|
(Printexc.to_string e)
|
|
|
|
let load_dir d =
|
|
let dynlink_exts =
|
|
if Dynlink.is_native then [".cmxs"] else [".cmo"; ".cma"]
|
|
in
|
|
Array.iter
|
|
(fun f ->
|
|
if List.exists (Filename.check_suffix f) dynlink_exts then
|
|
load_file (Filename.concat d f))
|
|
(Sys.readdir d)
|