---
name: config_from_env
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func ConfigFromEnv(target any) error"
description: "Puebla una struct de configuracion desde variables de entorno usando reflection y struct tags (env, default, required, secret). Soporta string, int, int64, bool, float64 y []string (comma-separated). Acumula todos los errores antes de retornar."
tags: [config, env, reflect, infra, tags, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [fmt, os, reflect, strconv, strings]
params:
  - name: target
    desc: "puntero no-nil a struct con tags env, default, required y/o secret en sus campos exportados"
output: "nil si la struct se poblo correctamente, error si falta una variable required o hay un tipo incompatible"
tested: true
tests:
  - "populate string field desde env"
  - "populate int field con conversion"
  - "populate bool field con conversion"
  - "populate float64 field"
  - "populate slice string comma-separated"
  - "valor default usado cuando env no seteada"
  - "required sin valor retorna error"
  - "int invalido retorna error descriptivo"
  - "puntero nil retorna error"
test_file_path: "functions/infra/config_from_env_test.go"
file_path: "functions/infra/config_from_env.go"
---

## Ejemplo

```go
type AppConfig struct {
    Host    string   `env:"HOST"     default:"localhost"`
    Port    int      `env:"PORT"     default:"8080"  required:"true"`
    APIKey  string   `env:"API_KEY"  required:"true" secret:"true"`
    Tags    []string `env:"TAGS"     default:"prod,stable"`
    Debug   bool     `env:"DEBUG"    default:"false"`
    Timeout float64  `env:"TIMEOUT"  default:"30.0"`
}

var cfg AppConfig
if err := ConfigFromEnv(&cfg); err != nil {
    log.Fatal(err)
}
```

## Notas

Sin dependencias externas — solo stdlib. Tipos soportados: string, int/int64, uint/uint64, bool, float32/float64, []string. Los []string se parsean splitteando por coma y trimeando espacios. El tag secret:"true" no tiene efecto en runtime (solo documentacion — ver ConfigDump para ocultar al loggear).
