58 lines
2.3 KiB
Go
58 lines
2.3 KiB
Go
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)
|
||
}
|
||
}
|
||
}
|