MoonBit package configuration parser
///|
test "parse moon.mod" {
let source =
#|name = "example/app"
#|version = "0.1.0"
#|import { "moonbitlang/x@0.4.6" }
#|
let result = @moon_config.parse_moon_mod(source)
assert_eq(result.diagnostics.errors.length(), 0) // no error
assert_true(result.ast.to_json() is Array([_, _, _]))
}///|
test "parse moon.pkg" {
let source =
#|import {
#| "moonbitlang/core/json" @json,
#|}
#|options(
#| "is-main": true,
#|)
#|
let result = @moon_config.parse_moon_pkg(source)
assert_eq(result.diagnostics.errors.length(), 0) // no error
assert_eq(result.ast.0.length(), 2)
}///|
test "parse moon.work" {
let source =
#|members = ["./app", "./shared"]
#|preferred_target = "native"
#|
let result = @moon_config.parse_moon_work(source)
assert_eq(result.diagnostics.errors.length(), 0) // no error
assert_eq(result.ast.0.length(), 2)
}///|
test "conditional imports" {
let source = "#cfg(target = \"js\")\nimport { \"platform/js\" }\nexperimental = true"
let result = @moon_config.parse_moon_pkg(source)
assert_eq(result.diagnostics.errors.length(), 0)
guard result.ast.0[0] is Import(conditions~, ..) else {
fail("expected import")
}
assert_eq(conditions.length(), 1)
assert_eq(conditions[0].parsed, Some(@moon_config.Condition::Target("js")))
}pub(all) enum Expr {
Bool(value~ : Bool, loc~ : Location)
Int(repr~ : String, loc~ : Location)
String(str~ : String, loc~ : Location)
Array(items~ : Array[Expr], loc~ : Location)
Map(fields~ : Array[Field], loc~ : Location)
Apply(name~ : String, name_loc~ : Location, args~ : Array[Field], args_loc~ : Location, loc~ : Location)
Hole(Location)
} derive(Eq, Debug)pub(all) enum Statement {
Import(items~ : Array[ImportItem], kind~ : ImportKind, conditions~ : Array[ImportCondition], keyword_loc~ : Location, list_loc~ : Location, loc~ : Location)
Assign(Field)
Expr(Expr)
} derive(Eq, Debug)fn parse_moon_mod(name? : String, keep_comments? : Bool, validate? : Bool, source : String) -> ParseResultfn parse_moon_pkg(name? : String, start_pos? : Position, keep_comments? : Bool, validate? : Bool, source : String) -> ParseResultfn parse_moon_work(name? : String, keep_comments? : Bool, validate? : Bool, source : String) -> ParseResult