Fight with the type

This commit is contained in:
Aoran Zeng 2025-07-16 17:31:11 +08:00
parent 8032921182
commit bdba1fac31
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98

View File

@ -21,36 +21,42 @@ class ConfigItem's-Value {
has Str $.raw-value;
has Any $.parsed-value;
method new($raw-text) {
#| $raw-text undefined
method new(Str $input-text) {
my $type;
my $parsed;
my $parsed-value;
given $raw-text {
my $raw-value = $input-text;
# 明确区分空字符串和无值情况
# 这种情况不可能是用户写的(并没有nil这个字面量)
if ! $input-text.defined {
$type = RS4C-Nil;
$parsed-value = Nil;
$raw-value = "<internal-rs4c-nil>"; # 一个完全用不到的值,但是由于 $.raw-value 类型是字符串,所以必须随便给一个值
}
else {
# wrtd: 不要试图在这里利用 given when 统一处理未定义的值,因为会一直报错
given $input-text {
when /^ ':' (.+) $/ {
# 模式值 :mode
$type = RS4C-Mode;
$parsed = ~$0;
$parsed-value = ~$0;
}
when /^ ('true'|'false'|'yes'|'no') $/ {
# 特殊字面量 - true/false/yes/no 都是 literal
$type = RS4C-Bool;
$parsed = ~$0 ~~ /^('true'|'yes')$/ ?? True !! False;
}
# 明确区分空字符串和无值情况
# 这种情况不可能是用户写的(并没有nil这个字面量),只由内部实现时刻意传 Nil 出现
when Nil {
$type = RS4C-Nil;
$parsed = Nil;
$parsed-value = ~$0 ~~ /^('true'|'yes')$/ ?? True !! False;
}
# 输入为空时被当做是字符串类型
default {
# 普通字符串
$type = RS4C-String;
$parsed = $raw-text;
$parsed-value = $input-text;
}
}
self.bless(:$type, :raw-value($raw-text), :parsed-value($parsed));
}
self.bless(:$type, :$raw-value, :$parsed-value);
}
# 获得适合调用者接受的值