Optional Morphir target profile for moonrockz/gleam-parser
import {
"moonrockz/gleam-parser-morphir" @morphir,
}| Source | Standard preset | With the Morphir profile |
|---|---|---|
| Ordinary Gleam and standard target annotations | Accepted | Accepted |
| @target(morphir) | Unknown target | Definition retains a Morphir restriction |
| @external(morphir, "module", "symbol") | Unknown target | Function or external type retains a Morphir binding |
| @target(scala) or @target(go) | Unknown target | Unknown target unless another profile registers it |
@target(morphir)
pub const destination = "morphir"
pub const shared = 42///|
test "mr: retain restricted and shared definitions" {
let source =
#|@target(morphir)
#|pub const destination = "morphir"
#|
#|pub const shared = 42
let config = {
..@morphir.Config::default(),
dialect: @morphir.Dialect::gleam_1_19().with_profile(@morphir.profile()),
}
assert_eq(@morphir.parse_text(source).has_errors(), true)
let result = @morphir.parse_text(source, config~)
assert_eq(result.has_errors(), false)
assert_eq(result.module_.definitions.length(), 2)
assert_eq(
result.module_.definitions[0].target.map(t => t.name()),
Some("morphir"),
)
assert_eq(result.module_.definitions[1].target, None)
}@external(erlang, "erlang", "length")
@external(javascript, "./list.mjs", "length")
@external(morphir, "morphir/sdk/list", "length")
pub fn length(xs: List(a)) -> Int///|
test "mr: retain a Morphir function binding" {
let dialect = @morphir.Dialect::gleam_1_19().with_profile(@morphir.profile())
let config = { ..@morphir.Config::default(), dialect, }
let source =
#|@external(erlang, "erlang", "length")
#|@external(javascript, "./list.mjs", "length")
#|@external(morphir, "morphir/sdk/list", "length")
#|pub fn length(xs: List(a)) -> Int
#|
let result = @morphir.parse_text(source, config~)
assert_eq(result.has_errors(), false)
guard result.module_.definitions[0].definition is Function(function) else {
fail("expected a function")
}
assert_eq(function.externals.all().length(), 3)
assert_eq(
function.external_for(@morphir.Target::Erlang).unwrap().module_,
"erlang",
)
assert_eq(
function.external_for(@morphir.Target::JavaScript).unwrap().module_,
"./list.mjs",
)
let target = dialect.targets.resolve("morphir").unwrap()
let binding = function.external_for(target).unwrap()
assert_eq(binding.module_, "morphir/sdk/list")
assert_eq(binding.function, "length")
assert_eq(result.module_.definitions[0].target, None)
assert_eq(@morphir.format_parsed(result), source)
assert_eq(
@morphir.decode_extended(@morphir.encode_extended(result)).parsed,
result.parsed(),
)
}@target(morphir)
@external(morphir, "example/domain", "CustomerId")
pub type CustomerId///|
test "mr: external types and restrictions stay distinct" {
let dialect = @morphir.Dialect::gleam_1_19().with_profile(@morphir.profile())
let config = { ..@morphir.Config::default(), dialect, }
let result = @morphir.parse_text(
"@target(morphir)\n@external(morphir, \"example/domain\", \"CustomerId\")\npub type CustomerId\n",
config~,
)
assert_eq(result.has_errors(), false)
assert_eq(
result.module_.definitions[0].target.map(t => t.name()),
Some("morphir"),
)
guard result.module_.definitions[0].definition is CustomType(type_) else {
fail("expected an external type")
}
assert_eq(type_.externals.all()[0].external.function, "CustomerId")
assert_eq(
@morphir.parse_text("@target(morphir) pub const x = 1").has_errors(),
true,
)
assert_eq(dialect.knows_target("go"), false)
}///|
test "mr: compose a separately defined target" {
let scala = @morphir.Profile(
"example/scala@1",
[@morphir.Target::extension("scala")][:],
)
let dialect = @morphir.Dialect::gleam_1_19()
.with_profile(@morphir.profile())
.with_profile(scala)
assert_eq(dialect.knows_target("morphir"), true)
assert_eq(dialect.knows_target("scala"), true)
let available = @morphir.Profiles([@morphir.profile(), scala][:])
let config = @morphir.Config::from_toml(
"[parser]\nprofiles = [\"moonrockz/gleam-parser-morphir@0.1.2\", \"example/scala@1\"]\n",
profiles=available,
).to_config(@morphir.Config::default())
assert_eq(config.dialect, dialect)
}test {
let orbit = @gleam.Target::extension("orbit")
let config = {
..@gleam.Config::default(),
dialect: @gleam.Dialect::gleam_1_19().register_target(orbit),
}
let result = @gleam.parse_text("@target(orbit) const answer = 42", config~)
let document = @gleam.decode_extended(@gleam.encode_extended(result))
assert_eq(document.parsed, result.parsed())
}test {
let parsed = @gleam.parse_text("const x = 1").parsed()
assert_eq(@gleam.decode_parsed(@gleam.encode_parsed(parsed)), parsed)
}test {
inspect(@gleam.format("const x = 1\n"), content="const x = 1\n")
}test {
let r = @gleam.parse_text("pub fn main() {\n io.println(\"hi\")\n}\n")
inspect(r.module_.definitions.length(), content="1")
inspect(r.has_errors(), content="false")
}@target(morphir)
pub const answer = 42
@external(morphir, "example/domain", "CustomerId")
pub type CustomerIdtest {
let dialect = @morphir.Dialect::gleam_1_19().with_profile(@morphir.profile())
let config = { ..@morphir.Config::default(), dialect, }
let result = @morphir.parse_text(
"@target(morphir) pub const answer = 42",
config~,
)
assert_eq(result.has_errors(), false)
assert_eq(dialect.knows_target("scala"), false)
}fn version() -> String