diff --git a/.gitignore b/.gitignore index 74e0096c2..3a7a6f4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,17 @@ share/python-wheels/ *.egg MANIFEST +# Erlang +*.beam +*.plt +.erlang.cookie +.eunit +.rebar +.rebar3 +_build +priv/crates +rebar3.crashdump + # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/pgml-sdks/pgml/erlang/Makefile b/pgml-sdks/pgml/erlang/Makefile new file mode 100644 index 000000000..e303b91eb --- /dev/null +++ b/pgml-sdks/pgml/erlang/Makefile @@ -0,0 +1,44 @@ +REBAR3 ?= $(shell test -e `which rebar3` 2>/dev/null && which rebar3 || echo "./rebar3") + +.PHONY: deps test build + +all: build + +build: $(REBAR3) + @$(REBAR3) compile + +deps: + @$(REBAR3) deps + +fmt: + @$(REBAR3) fmt --write + +fmt-check: + @$(REBAR3) fmt --check + +shell: + @$(REBAR3) cargo clean + @$(REBAR3) shell + +clean: + @$(REBAR3) clean + +clean-all: + rm -rf $(CURDIR)/priv/crates + rm -rf $(CURDIR)/_build + +distclean: clean + @$(REBAR3) clean --all + +docs: + @$(REBAR3) edoc + +test: + @$(REBAR3) cargo clean + @$(REBAR3) eunit + +test-all: + @$(REBAR3) do eunit, ct, cover + +release: test + @$(REBAR3) as prod release diff --git a/pgml-sdks/pgml/erlang/README.md b/pgml-sdks/pgml/erlang/README.md new file mode 100644 index 000000000..6a18d969c --- /dev/null +++ b/pgml-sdks/pgml/erlang/README.md @@ -0,0 +1,17 @@ +# pgml + +An Erlang NIF library written in Rust + +## Build + +``` shell +make +make fmt +``` + +## Test + +``` shell +make test +``` + diff --git a/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml b/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml new file mode 100644 index 000000000..c6435672a --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.'cfg(target_os = "macos")'] +rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +] \ No newline at end of file diff --git a/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock b/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock new file mode 100644 index 000000000..80fe79a2a --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock @@ -0,0 +1,142 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "pgml" +version = "0.1.0" +dependencies = [ + "rustler", +] + +[[package]] +name = "proc-macro2" +version = "1.0.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustler" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d51ae0239c57c3a3e603dd855ace6795078ef33c95c85d397a100ac62ed352" +dependencies = [ + "rustler_codegen", + "rustler_sys", +] + +[[package]] +name = "rustler_codegen" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27061f1a2150ad64717dca73902678c124b0619b0d06563294df265bc84759e1" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustler_sys" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2062df0445156ae93cf695ef38c00683848d956b30507592143c01fe8fb52fda" +dependencies = [ + "regex", + "unreachable", +] + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" diff --git a/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml b/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml new file mode 100644 index 000000000..a32d9be94 --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pgml" +version = "0.1.0" +edition = "2021" + + +[lib] +name = "pgml" +path = "src/lib.rs" +crate-type = ["dylib"] + + +[dependencies] +rustler = "0.33.0" diff --git a/pgml-sdks/pgml/erlang/native/pgml/README.md b/pgml-sdks/pgml/erlang/native/pgml/README.md new file mode 100644 index 000000000..7f477ccad --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/README.md @@ -0,0 +1,35 @@ +# NIF for pgml + +## To compile the NIF in Erlang: + +Add the following lines to your `rebar.config` file: + +``` erlang +{plugins, [rebar3_rustler]}. + +{cargo_opts, [ + {src_dir, "native/pgml"} +]}. + +{provider_hooks, [ + {pre, [ + {compile, {cargo, build}} + ]}, + {post, [ + {clean, {cargo, clean}}, + {eunit, {cargo, test}} + ]} +]}. +``` + +## Build + +``` shell +cargo build +``` + +## Test + +``` shell +cargo test +``` diff --git a/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml b/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml new file mode 100644 index 000000000..0a135836b --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "nightly" +components = [ "rustfmt", "clippy" ] +profile = "minimal" diff --git a/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs b/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs new file mode 100644 index 000000000..872841d8f --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs @@ -0,0 +1,4 @@ +rustler::init!("pgml", []); + +#[cfg(test)] +mod tests {} diff --git a/pgml-sdks/pgml/erlang/rebar.config b/pgml-sdks/pgml/erlang/rebar.config new file mode 100644 index 000000000..0f70a5eba --- /dev/null +++ b/pgml-sdks/pgml/erlang/rebar.config @@ -0,0 +1,27 @@ +{project_plugins, [{erlfmt, "~> 1.3"}]}. + +{erl_opts, [debug_info]}. + +{deps, []}. + +{plugins, [rebar3_cargo]}. + +{cargo_opts, [ + {src_dir, "native/pgml"} +]}. + +{provider_hooks, [ + {pre, [ + {compile, {cargo, build}} + ]}, + {post, [ + {clean, {cargo, clean}}, + {eunit, {cargo, test}} + ]} +]}. + +{erlfmt, [ + check, + verbose, + {files, ["src/*", "rebar.config"]} +]}. diff --git a/pgml-sdks/pgml/erlang/rebar.lock b/pgml-sdks/pgml/erlang/rebar.lock new file mode 100644 index 000000000..57afcca04 --- /dev/null +++ b/pgml-sdks/pgml/erlang/rebar.lock @@ -0,0 +1 @@ +[]. diff --git a/pgml-sdks/pgml/erlang/src/cargo.hrl b/pgml-sdks/pgml/erlang/src/cargo.hrl new file mode 100644 index 000000000..52e5abacf --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/cargo.hrl @@ -0,0 +1,14 @@ +-cargo_header_version(1). +-ifndef(CARGO_LOAD_APP). +-define(CARGO_LOAD_APP, pgml). +-endif. +-ifndef(CARGO_HRL). +-define(CARGO_HRL, 1). +-define(load_nif_from_crate(__CRATE, __INIT), + (fun() -> + __APP = ?CARGO_LOAD_APP, + __PATH = filename:join([code:priv_dir(__APP), "crates", __CRATE, __CRATE]), + erlang:load_nif(__PATH, __INIT) + end)() +). +-endif. diff --git a/pgml-sdks/pgml/erlang/src/pgml.app.src b/pgml-sdks/pgml/erlang/src/pgml.app.src new file mode 100644 index 000000000..9560625ea --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/pgml.app.src @@ -0,0 +1,14 @@ +{application, pgml, [ + {description, "An OTP library"}, + {vsn, "0.1.0"}, + {registered, []}, + {applications, [ + kernel, + stdlib + ]}, + {env, []}, + {modules, []}, + + {licenses, ["Apache 2.0"]}, + {links, []} +]}. diff --git a/pgml-sdks/pgml/erlang/src/pgml.erl b/pgml-sdks/pgml/erlang/src/pgml.erl new file mode 100644 index 000000000..9c22fea74 --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/pgml.erl @@ -0,0 +1,33 @@ +-module(pgml). + +-export([]). + +-include("cargo.hrl"). + +-on_load init/0. + +-define(NOT_LOADED, not_loaded(?LINE)). + +%%%=================================================================== +%%% API +%%%=================================================================== + +%%%=================================================================== +%%% NIF +%%%=================================================================== + +init() -> + ?load_nif_from_crate(pgml, 0). + +not_loaded(Line) -> + erlang:nif_error({not_loaded, [{module, ?MODULE}, {line, Line}]}). + +%%%=================================================================== +%%% Tests +%%%=================================================================== + +-ifdef(TEST). + +-include_lib("eunit/include/eunit.hrl"). + +-endif. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy