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