Add ConfigParser

This commit is contained in:
Aoran Zeng 2025-07-13 01:45:56 +08:00
parent f8473dfac7
commit 659fbc53ce
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98

View File

Internal Server Error - Gitea: Git server for yexuejc
500 Internal Server Error

Gitea Version: 1.23.8

@ -0,0 +1,235 @@
#!/usr/bin/env raku
# ---------------------------------------------------------------
# File Name : ConfigParser.rakumod
# File Authors : Aoran Zeng <ccmywish@qq.com>
# Contributors : Nul None <nul@none.org>
# Created On : <2025-07-12>
# Last Modified : <2025-07-13>
#
# Configuration parsing
# ---------------------------------------------------------------
unit module ConfigParser;
enum ConfigValueType <String Mode Boolean>;
#
# @brief 配置项的值
#
class ConfigValue {
has ConfigValueType $.type;
has $.raw-value;
has $.parsed-value;
method new($raw-text) {
my $type;
my $parsed;
given $raw-text {
when /^ ':' (.+) $/ {
# 模式值 :mode
$type = Mode;
$parsed = ~$0;
}
when /^ ('true'|'false'|'yes'|'no') $/ {
# 特殊字面量 - true/false/yes/no 都是 literal
$type = Boolean;
$parsed = ~$0 ~~ /^('true'|'yes')$/ ?? True !! False;
}
default {
# 普通字符串
$type = String;
$parsed = $raw-text;
}
}
self.bless(:$type, :raw-value($raw-text), :parsed-value($parsed));
}
method as-string() {
return $.parsed-value.Str;
}
method as-bool() {
given $.type {
when Boolean { return $.parsed-value; }
when String {
# 尝试将字符串解析为布尔值
return $.parsed-value ~~ /^('true'|'yes')$/;
}
default { return False; }
}
}
# 获取模式值(去掉冒号前缀)
method as-mode() {
return $.type == Mode ?? $.parsed-value !! $.raw-value;
}
# 类型检查方法
method is-mode() { return $.type == Mode; }
method is-bool() { return $.type == Boolean; }
method is-string() { return $.type == String; }
}
#
# @brief 承载 config items 的容器
#
class Config {
has %.items;
method set($k, $raw-value) {
%.items{$k} = ConfigValue.new($raw-value);
}
method get($k, $default = Nil) {
return %.items{$k} // ($default ?? ConfigValue.new($default) !! ConfigValue.new(''));
}
method exist($k) {
return %.items{$k}:exists;
}
# 配置项名称
# @danger: 把这个函数命名为 items会让我的机器蓝屏.....
method keys() {
return %.items.keys;
}
}