func Load()

in src/psearch/serving/internal/config/config.go [48:106]


func Load() (*Config, error) {
	// Load .env file if it exists
	godotenv.Load()

	// Default configuration
	config := &Config{
		Port:              8080,
		Environment:       "development",
		GeminiModelName:   "text-multilingual-embedding-002",
		EmbeddingDimension: 768,
		DefaultAlpha:      0.5,
		DefaultLimit:      100,
		MinScoreValue:     0.0,
	}

	// Override with environment variables if set
	if port, err := strconv.Atoi(getEnv("PORT", "8080")); err == nil {
		config.Port = port
	}

	config.Environment = getEnv("ENVIRONMENT", config.Environment)
	config.ProjectID = getEnv("PROJECT_ID", "")
	config.Region = getEnv("REGION", "us-central1")
	config.SpannerInstanceID = getEnv("SPANNER_INSTANCE_ID", "")
	config.SpannerDatabaseID = getEnv("SPANNER_DATABASE_ID", "")
	config.GeminiModelName = getEnv("GEMINI_MODEL_NAME", config.GeminiModelName)

	// Parse numeric values with defaults
	if dim, err := strconv.Atoi(getEnv("EMBEDDING_DIMENSION", "768")); err == nil {
		config.EmbeddingDimension = dim
	}

	if alpha, err := strconv.ParseFloat(getEnv("DEFAULT_HYBRID_ALPHA", "0.5"), 64); err == nil {
		config.DefaultAlpha = alpha
	}

	if limit, err := strconv.Atoi(getEnv("DEFAULT_LIMIT", "10")); err == nil {
		config.DefaultLimit = limit
	}

	if minScore, err := strconv.ParseFloat(getEnv("MIN_SCORE_VALUE", "0.0"), 64); err == nil {
		config.MinScoreValue = minScore
	}

	// Validate required configuration
	if config.ProjectID == "" {
		return nil, fmt.Errorf("PROJECT_ID environment variable is required")
	}

	if config.SpannerInstanceID == "" {
		return nil, fmt.Errorf("SPANNER_INSTANCE_ID environment variable is required")
	}

	if config.SpannerDatabaseID == "" {
		return nil, fmt.Errorf("SPANNER_DATABASE_ID environment variable is required")
	}

	return config, nil
}