textmachine/backend/cmd/tmctl/dotenv.go

58 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bufio"
"io"
"os"
"strings"
)
// dotenv.go: чтение backend/.env (gitignored) в окружение. Парсер выделен чистой
// функцией (пакет №4): правила «парные кавычки» и «не перекрывать выставленное»
// — находки прошлых ревью, жившие только в комментариях; теперь они закреплены
// юнитами (регресс «упростили в strings.Trim» ломал бы значения ключей API и
// всплывал бы необъяснимыми 401 посреди приёмочного прогона).
// dotenvPair is one KEY=VALUE line of a .env file.
type dotenvPair struct{ K, V string }
// parseDotEnv reads KEY=VALUE lines: пропускает пустые/комментарии/без «=»,
// триммит ключ и значение, снимает только ПАРНЫЕ обрамляющие кавычки — Trim по
// набору символов откусил бы легитимную кавычку в конце значения (находка ревью).
func parseDotEnv(r io.Reader) []dotenvPair {
var out []dotenvPair
sc := bufio.NewScanner(r)
for sc.Scan() {
line := strings.TrimSpace(sc.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
k, v, ok := strings.Cut(line, "=")
if !ok {
continue
}
k, v = strings.TrimSpace(k), strings.TrimSpace(v)
if n := len(v); n >= 2 && (v[0] == '"' || v[0] == '\'') && v[n-1] == v[0] {
v = v[1 : n-1]
}
out = append(out, dotenvPair{K: k, V: v})
}
return out
}
// loadDotEnv reads KEY=VALUE lines into the environment without overriding
// already-set variables. Ключи — из backend/.env (gitignored); секреты никогда
// не попадают в конфиги/репо. Заметь: переменная, выставленная в ПУСТУЮ строку,
// считается невыставленной и будет перекрыта (текущее поведение, заморожено).
func loadDotEnv(path string) {
f, err := os.Open(path)
if err != nil {
return
}
defer f.Close()
for _, p := range parseDotEnv(f) {
if os.Getenv(p.K) == "" {
os.Setenv(p.K, p.V)
}
}
}