(path, format string)
| 147 | } |
| 148 | |
| 149 | func readConfigFile(path, format string) (map[string]any, error) { |
| 150 | raw, err := os.ReadFile(path) |
| 151 | if err != nil { |
| 152 | if os.IsNotExist(err) { |
| 153 | return map[string]any{}, nil |
| 154 | } |
| 155 | return nil, fmt.Errorf("configwriter: read %s: %w", path, err) |
| 156 | } |
| 157 | if len(raw) == 0 { |
| 158 | return map[string]any{}, nil |
| 159 | } |
| 160 | out := map[string]any{} |
| 161 | switch format { |
| 162 | case "json": |
| 163 | if err := json.Unmarshal(raw, &out); err != nil { |
| 164 | return nil, fmt.Errorf("configwriter: parse %s: %w", path, err) |
| 165 | } |
| 166 | case "toml": |
| 167 | if err := tomlv2.Unmarshal(raw, &out); err != nil { |
| 168 | return nil, fmt.Errorf("configwriter: parse %s: %w", path, err) |
| 169 | } |
| 170 | case "yaml": |
| 171 | if err := yaml.Unmarshal(raw, &out); err != nil { |
| 172 | return nil, fmt.Errorf("configwriter: parse %s: %w", path, err) |
| 173 | } |
| 174 | default: |
| 175 | return nil, fmt.Errorf("configwriter: unknown format %q", format) |
| 176 | } |
| 177 | return out, nil |
| 178 | } |
| 179 | |
| 180 | func writeConfigFile(path, format string, data map[string]any) error { |
| 181 | if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { |
no test coverage detected