# --------------------------------------------------------------- # SPDX-License-Identifier: GPL-3.0-or-later # --------------------------------------------------------------- # File Name : Config.rakumod # File Authors : Aoran Zeng # Contributors : Nul None # Created On : <2025-07-16> # Last Modified : <2025-07-16> # # Represent a section's working configuration # --------------------------------------------------------------- use Parser; unit module Config; #| 一个 section 的配置 (基于层次化结构而形成的最终真正生效的配置) class SectionConfig { has Parser::Section $.section; method new($section) { self.bless(:$section); } #| 从当前 section 开始,向上遍历父节点查找配置项 #| #| @param $default 注意,这里要使用配置项值的语法! #| method get-inherited-config($key, Str $default?) { my $current = $.section; while $current { if $current.configblock.exist($key) { return $current.configblock.get($key); } $current = $current.parent; } # 如果都没找到,生成一个新值 # 当 $default 为空时,生成的是 RS4C-Nil return Parser::ConfigItem's-Value.new($default); } #| 非层次化读取,仅读取当前 section 自己的配置项 #| #| @param $default 注意,这里要使用配置项值的语法! #| method get-direct-config($key, Str $default?) { if $.section.configblock.exist($key) { return $.section.configblock.get($key); } if ! $default.defined { # say "DEBUG: Key <$key> is undefined"; } return Parser::ConfigItem's-Value.new($default); } # ============================================================ # 返回当前 section 的 各种配置 # 注意,这些函数全部都返回 ConfigValue's-Value 实例 #| RS4C-Mode method translate-mode() { return self.get-inherited-config('translate', ':escape'); } #| RS4C-Mode method output-mode() { return self.get-inherited-config('output', ':terminal'); } #| RS4C-String method prefix() { return self.get-inherited-config('prefix', '_rawstr4c'); } #| RS4C-Mode 或 RS4C-String method postfix() { return self.get-inherited-config('postfix', ':use-language'); } #| RS4C-Bool method keep-prefix() { return self.get-inherited-config('keep-prefix', 'true'); } #| RS4C-Bool method keep-postfix() { return self.get-inherited-config('keep-postfix', 'true'); } #| RS4C-String 或 RS4C-Nil method language() { return self.get-direct-config('language'); } #| RS4C-String 或 RS4C-Nil method name() { return self.get-direct-config('name'); } #| RS4C-Bool method name-literally() { return self.get-direct-config('name-literally', 'false'); } # RS4C-String method namespace() { my $config-namespace = self.get-direct-config('namespace', ''); my $current-namespace = $config-namespace.string-value; # 嵌套增加 my $parent = $.section.parent; while $parent { if $parent.configblock.exist('namespace') { $current-namespace = $parent.configblock.get('namespace').string-value ~ $current-namespace; } else { # 空字符串 $current-namespace = '' ~ $current-namespace; } $parent = $parent.parent; } return Parser::ConfigItem's-Value.new($current-namespace); } #| RS4C-Bool method debug() { return self.get-inherited-config('debug', 'false'); } }