--- name: migration_parse kind: function lang: go domain: infra version: "1.0.0" purity: pure signature: "func MigrationParse(filename string, content string) (Migration, error)" description: "Parsea el nombre de archivo y el contenido SQL de una migracion. Extrae version y nombre del filename (patron NNN_nombre.sql) y separa bloques up/down por marcadores -- +up / -- +down. Error si el formato es invalido o falta el bloque up." tags: [migration, database, sql, schema, sqlite, parse] uses_functions: [] uses_types: [Migration_go_infra] returns: [Migration_go_infra] returns_optional: false error_type: "" imports: ["fmt", "strconv", "strings"] params: - name: filename desc: "nombre del archivo de migracion (ej: 001_create_users.sql). Puede incluir path completo." - name: content desc: "contenido completo del archivo .sql con marcadores -- +up y -- +down" output: "Migration con version, nombre, up_sql y down_sql extraidos del archivo" tested: true tests: - "archivo valido con up y down retorna Migration correcta" - "archivo sin bloque down retorna DownSQL vacio sin error" - "filename sin separador underscore retorna error" - "version no numerica retorna error" - "bloque up vacio retorna error" - "version cero retorna error" - "nombre descriptivo vacio retorna error" - "filename con path completo extrae nombre base" test_file_path: "functions/infra/migration_parse_test.go" file_path: "functions/infra/migration_parse.go" --- ## Ejemplo ```go content := ` -- +up CREATE TABLE users ( id TEXT PRIMARY KEY, name TEXT NOT NULL ); -- +down DROP TABLE IF EXISTS users; ` m, err := MigrationParse("001_create_users.sql", content) // m.Version = 1 // m.Name = "create_users" // m.UpSQL = "CREATE TABLE users (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL\n);" // m.DownSQL = "DROP TABLE IF EXISTS users;" ``` ## Notas Funcion pura — no hace I/O. El marcador `-- +up` es obligatorio; `-- +down` es opcional (retorna DownSQL vacio). Si el archivo tiene down antes que up, se parsea igualmente. Los bloques se recortan con `strings.TrimSpace`. El formato de version es un entero positivo con cualquier numero de digitos (001, 01, 1 son equivalentes).