Optional Morphir target profile for moonrockz/gleam-parser
import {
"moonrockz/gleam-parser-morphir" @morphir,
}///|
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(morphir, \"morphir/sdk/list\", \"length\")\npub fn length(xs: List(a)) -> Int\n"
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")
}
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(),
)
}///|
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.1\", \"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")
}test {
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