package config import ( "encoding/json" "time" "git.loyso.art/frx/kurious/internal/common/errors" ) type YCAuth interface { isYCAuth() } type YCAuthCAKeysFile struct{ Path string } func (YCAuthCAKeysFile) isYCAuth() {} type YCAuthIAMToken struct{ Token string } func (YCAuthIAMToken) isYCAuth() {} type YCAuthNone struct{} func (YCAuthNone) isYCAuth() {} type YDB struct { DSN string Auth YCAuth ShutdownDuration time.Duration DebugYDB bool } func (ydb *YDB) UnmarshalJSON(data []byte) error { type ydbConfig struct { DSN string `json:"dsn"` CAKeysFile *string `json:"ca_keys_file_path"` StaticIAMToken *string `json:"static_iam_token"` ShutdownDuration Duration `json:"duration"` } var imcfg ydbConfig err := json.Unmarshal(data, &imcfg) if err != nil { return err } ydb.DSN = imcfg.DSN ydb.ShutdownDuration = imcfg.ShutdownDuration.Std() if imcfg.CAKeysFile != nil && imcfg.StaticIAMToken != nil { return errors.NewValidationError("ca_keys_file_path", "could not be set together with static_iam_token field") } else if imcfg.CAKeysFile != nil { ydb.Auth = YCAuthCAKeysFile{ Path: *imcfg.CAKeysFile, } } else if imcfg.StaticIAMToken != nil { ydb.Auth = YCAuthIAMToken{ Token: *imcfg.StaticIAMToken, } } else { ydb.Auth = YCAuthNone{} } return nil }