c5_labsci/zciyon/ini.go
2026-01-27 00:52:00 +08:00

118 lines
2.4 KiB
Go

package zciyon
import (
"bufio"
"os"
"strings"
)
// toml
type CiyINI struct {
filePath string
sections map[string]map[string]string
}
func NewCiyINI(filepath string) (*CiyINI, error) {
ini := &CiyINI{}
ini.filePath = filepath
ini.sections = make(map[string]map[string]string)
f, err := os.Open(filepath)
if err != nil {
return ini, err
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
nowsection := ""
ini.sections[nowsection] = map[string]string{}
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if strings.TrimSpace(line) == "" {
continue
}
if strings.HasPrefix(line, "[") {
nowsection = strings.TrimSpace(line[1 : len(line)-1])
if ini.sections[nowsection] == nil {
ini.sections[nowsection] = map[string]string{}
}
} else {
ind := strings.Index(line, "=")
if ind == -1 {
ini.sections[nowsection][line] = "!!null!!"
} else {
val := strings.TrimSpace(line[ind+1:])
line = strings.TrimSpace(line[:ind])
ini.sections[nowsection][line] = val
}
}
}
return ini, nil
}
func (thos *CiyINI) GetKey(section, key, def string) string {
if vkey, ok := thos.sections[section]; ok {
if val, ok := vkey[key]; ok {
return val
}
}
return def
}
func (thos *CiyINI) GetKeyint(section, key string, def int) int {
if vkey, ok := thos.sections[section]; ok {
if val, ok := vkey[key]; ok {
return Toint(val)
}
}
return def
}
func (thos *CiyINI) GetSection(section string) map[string]string {
if vkey, ok := thos.sections[section]; ok {
return vkey
}
return nil
}
func (thos *CiyINI) SetKey(section, key string, newval any) {
if _, ok := thos.sections[section]; !ok {
thos.sections[section] = map[string]string{}
}
if _, ok := thos.sections[section][key]; !ok {
thos.sections[section][key] = ""
}
val := Tostr(newval)
if thos.sections[section][key] != val {
thos.sections[section][key] = val
}
}
func (thos *CiyINI) Save() error {
text := ""
for key, val := range thos.sections[""] {
if val == "!!null!!" {
text += key + "\n"
} else {
text += key + "=" + val + "\n"
}
}
for section, kvs := range thos.sections {
if section == "" {
continue
}
text += "\n[" + section + "]\n"
for key, val := range kvs {
if val == "!!null!!" {
text += key + "\n"
} else {
text += key + "=" + val + "\n"
}
}
}
err := FileSave(thos.filePath, text)
if err != nil {
return err
}
return nil
}