package cuit import ( "encoding/json" "errors" "fmt" "io" "net/http" "strings" "sync" "github.com/gabdlr/api-cuit-go/utils" ) type Address struct { Provincia string `json:"provincia"` Localidad string `json:"localidad"` Domicilio string `json:"domicilio"` PisoDeptoOfi string `json:"pisoDeptoOfi"` CodigoPostal string `json:"codigoPostal"` EstadoDeDomicilio string `json:"estadoDeDomicilio"` } type Society struct { RazonSocial string `json:"razonSocial"` Cuit string `json:"cuit"` TipoSocietario string `json:"tipoSocietario"` FechaDeContrato string `json:"fechaDeContrato"` NumeroRegistroLocal string `json:"numeroRegistroLocal"` } type CuitInfo struct { Sociedad Society `json:"sociedad"` DomicilioFiscal Address `json:"domicilioFiscal"` DomicilioLegal Address `json:"domicilioLegal"` FechaActualizacion string `json:"fechaActualizacion"` } const htmlOfInterestStart = ` -1 || endElement > -1 { elements = append(elements, s[startElement+len(startMarker):endElement]) s = s[endElement+len(endMarker):] } else { thereAreMoreElements = false } } return elements } func searchParagraphElements(s string) []string { return searchElements(s, "

", "

") } func updateCuitInfo(cuitInfo *CuitInfo, keyElements []string, wg *sync.WaitGroup) { go func() { defer wg.Done() sociedadElements := searchParagraphElements(keyElements[0]) if len(sociedadElements) == 5 { cuitInfo.Sociedad.RazonSocial = sociedadElements[0] cuitInfo.Sociedad.Cuit = sociedadElements[1] cuitInfo.Sociedad.TipoSocietario = sociedadElements[2] cuitInfo.Sociedad.FechaDeContrato = sociedadElements[3] cuitInfo.Sociedad.NumeroRegistroLocal = sociedadElements[4] } }() go func() { defer wg.Done() domicilioFiscalElements := searchParagraphElements(keyElements[1]) if len(domicilioFiscalElements) == 6 { cuitInfo.DomicilioFiscal.Provincia = domicilioFiscalElements[0] cuitInfo.DomicilioFiscal.Localidad = domicilioFiscalElements[1] cuitInfo.DomicilioFiscal.Domicilio = domicilioFiscalElements[2] cuitInfo.DomicilioFiscal.PisoDeptoOfi = domicilioFiscalElements[3] cuitInfo.DomicilioFiscal.CodigoPostal = domicilioFiscalElements[4] cuitInfo.DomicilioFiscal.EstadoDeDomicilio = domicilioFiscalElements[5] } }() go func() { defer wg.Done() domicilioLegalElements := searchParagraphElements(keyElements[2]) if len(domicilioLegalElements) == 6 { cuitInfo.DomicilioLegal.Provincia = domicilioLegalElements[0] cuitInfo.DomicilioLegal.Localidad = domicilioLegalElements[1] cuitInfo.DomicilioLegal.Domicilio = domicilioLegalElements[2] cuitInfo.DomicilioLegal.PisoDeptoOfi = domicilioLegalElements[3] cuitInfo.DomicilioLegal.CodigoPostal = domicilioLegalElements[4] cuitInfo.DomicilioLegal.EstadoDeDomicilio = domicilioLegalElements[5] } }() go func() { defer wg.Done() fechaActualizacionElements := searchParagraphElements(keyElements[3]) if len(fechaActualizacionElements) == 1 { cuitInfo.FechaActualizacion = fechaActualizacionElements[0] } }() } func parseResponse(html string) (cuitInfo CuitInfo, err error) { notFoundErr := "información no disponible" if strings.Contains(html, exitSignal) { err = errors.New(notFoundErr) return cuitInfo, err } startPosition := strings.Index(html, htmlOfInterestStart) endPosition := strings.Index(html, htmlOfInterestEnd) if startPosition != -1 && endPosition != -1 { info := html[startPosition:endPosition] startMarker := "