我目前使用配置程序库将配置文件读入其数据类型:
import Data.Configurator (Worth (Required), getMap, load)
import Data.Configurator.Types (convert)
import qualified Data.HashMap.Strict as H (empty, lookup)
loadConfig :: IO AppConfig
loadConfig = do
conf <- load [Required "application.cfg"] >>= getMap
let cfg def key = fromMaybe def . maybe (Just def) convert $ H.lookup key conf
return AppConfig { cfgDBHost = cfg "localhost" "db-host"
, cfgDBName = cfg "test" "db-name"
, cfgSesTime = cfg 28800 "ses-time"
, cfgMailDir = cfg "./mail" "mail-dir"
, cfgDistDir = cfg "./public" "dist-dir"
, cfgIndexHtml = cfg "index.html" "index-html"
, cfgUseTls = cfg False "use-tls"
, cfgTlsPort = cfg 8443 "tls-port"
, cfgTlsKey = cfg "key.pem" "tls-key"
, cfgTlsCrt = cfg "crt.pem" "tls-crt"
, cfgAppPort = cfg 3000 "app-port"
, cfgLDAPHost = cfg "" "ldap-host"
, cfgLDAPDomain = cfg "" "ldap-domain"
}
因此,如果存在文件解析错误或配置文件中不存在该设置,则会将默认设置分配给记录字段。
我的问题是这个。我想在最开始时使用默认值初始化AppConfig
,然后迭代使用从文件加载的设置更改它们的字段。我想保留默认值,因为它是出现错误或文件中不存在设置。
我想问题是我可以迭代记录字段吗? 如果可能的话,上述问题的最佳解决方案是什么? 总结一下。我想用默认设置填充记录字段,读取配置文件,使用配置文件中的可用设置覆盖记录字段。
感谢。