internal/runner_cli API

internal/runner_cli 包含 cli/ 中各符合性运行器共享的命令行基础设施:通用选项的解析、文件读取、从目录收集语料文件、诊断信息格式化以及 JSON 输出构造。它依赖 moonbitlang/x/fs,因此文件访问可在该包支持的目标上工作(运行器面向 native 构建)。它是一个内部包;示例不参与编译。参见教程和设计页。

导入(仅限模块内部):

import {
  "Luna-Flow/floating/internal/runner_cli",
}

命令行选项

CommonOptions

CommonOptions 保存每个运行器都能识别的选项,以及它未消耗的参数。

pub struct CommonOptions {
  // private fields
}

parse_common_options

parse_common_options(arguments, allow_shard?) 从完整的参数向量中提取 --json 和分片选项。

pub fn parse_common_options(Array[String], allow_shard? : Bool) -> Result[CommonOptions, String]

arguments[0] 是程序名,会被跳过。可识别的选项:

  • --json:设置 json();
  • --shard-count N、--shard-count=N、--shard-index I、--shard-index=I:仅当 allow_shard 为真(默认)时识别;否则保留在 remaining() 中。

其他所有参数按原顺序保留在 remaining() 中。错误:"--shard-count requires a value"(或 --shard-index);非整数时为 "invalid shard count: X";二元组无效时(分片数须为正,索引须在 0 ..< count 内)为 ShardSpec::try_new 的消息。默认值为一个分片、索引 0、关闭 JSON。

CommonOptions::json, shard_count, shard_index, remaining

这些访问器返回解析得到的值以及未消耗参数的副本。

pub fn CommonOptions::json(Self) -> Bool
pub fn CommonOptions::shard_count(Self) -> Int
pub fn CommonOptions::shard_index(Self) -> Int
pub fn CommonOptions::remaining(Self) -> Array[String]
///|
test "common options" {
  let options = @runner_cli.parse_common_options([
    "runner", "--json", "--shard-count=4", "--shard-index", "2", "--cases", "a1", "dir",
  ]).unwrap()
  inspect(options.json(), content="true")
  inspect(options.shard_count(), content="4")
  inspect(options.remaining().join(" "), content="--cases a1 dir")
}

parse_int

parse_int(name, text) 为选项 name 解析一个十进制整数。

pub fn parse_int(String, String) -> Result[Int, String]

错误为 "invalid NAME: TEXT"。

文件

read_source

read_source(path, label?) 读取整个 UTF-8 文件。

pub fn read_source(String, label? : String) -> Result[String, String]

错误为 "cannot read LABEL: PATH";label 默认为 "file"。

collect_files

collect_files(paths, suffix) 将文件和目录列表展开为名称以 suffix 结尾的文件的有序列表。

pub fn collect_files(Array[String], String) -> Result[Array[String], String]

目录贡献其直接子项中以 suffix 结尾者(形式为 dir + "/" + entry;不搜索子目录)。文件若以 suffix 结尾则贡献其自身,否则被忽略。结果按字符串顺序排序,因此运行在不同文件系统之间可复现。错误:"path does not exist: P"、"cannot inspect path: P"、"cannot read directory: P"。

诊断

format_diagnostic, format_diagnostic_at

这些函数将消息格式化为 source:line:column: message。

pub fn format_diagnostic(@conformance.SourceLocation, String) -> String
pub fn format_diagnostic_at(String, Int, String, column? : Int) -> String

format_diagnostic_at(source, line, message, column?) 使用 SourceLocation::new 构造位置(列号默认为 1;行号和列号被钳制为至少 1)。

///|
test "diagnostic format" {
  inspect(
    @runner_cli.format_diagnostic_at("add.decTest", 12, "malformed testcase row"),
    content="add.decTest:12:1: malformed testcase row",
  )
}

JSON 输出

json_int, json_string, json_bool, json_strings, json_object

这些函数为运行器报告构造 Json 值。

pub fn json_int(Int) -> Json
pub fn json_string(String) -> Json
pub fn json_bool(Bool) -> Json
pub fn json_strings(Array[String]) -> Json
pub fn json_object(Array[(String, Json)]) -> Json

json_int 以精确的十进制表示存储整数,因此打印时不带小数部分。json_object 保持字段顺序;重复的键保留其首次出现的位置和最后一次的值。

json_stringify

json_stringify(value) 将值打印为紧凑 JSON,字符串会被转义。

pub fn json_stringify(Json) -> String
///|
test "json report" {
  let report = @runner_cli.json_object([
    ("totalCases", @runner_cli.json_int(2)),
    ("failedIds", @runner_cli.json_strings(["a\"1"])),
  ])
  inspect(
    @runner_cli.json_stringify(report),
    content="{\"totalCases\":2,\"failedIds\":[\"a\\\"1\"]}",
  )
}

完整公共接口

此快照是该包生成的 pkg.generated.mbti。当正文与接口不一致时,以接口为准。

// Generated using `moon info`, DON'T EDIT IT
package "Luna-Flow/floating/internal/runner_cli"

import {
  "Luna-Flow/floating/internal/conformance",
}

// Values
pub fn collect_files(Array[String], String) -> Result[Array[String], String]

pub fn format_diagnostic(@conformance.SourceLocation, String) -> String

pub fn format_diagnostic_at(String, Int, String, column? : Int) -> String

pub fn json_bool(Bool) -> Json

pub fn json_int(Int) -> Json

pub fn json_object(Array[(String, Json)]) -> Json

pub fn json_string(String) -> Json

pub fn json_stringify(Json) -> String

pub fn json_strings(Array[String]) -> Json

pub fn parse_common_options(Array[String], allow_shard? : Bool) -> Result[CommonOptions, String]

pub fn parse_int(String, String) -> Result[Int, String]

pub fn read_source(String, label? : String) -> Result[String, String]

// Errors

// Types and methods
pub struct CommonOptions {
  // private fields
}
pub fn CommonOptions::json(Self) -> Bool
pub fn CommonOptions::remaining(Self) -> Array[String]
pub fn CommonOptions::shard_count(Self) -> Int
pub fn CommonOptions::shard_index(Self) -> Int

// Type aliases

// Traits