diff --git a/README.md b/README.md index 0026a77..3161b13 100644 --- a/README.md +++ b/README.md @@ -38,20 +38,22 @@ Basic Usage Import the library into your project and start generating mocks: ``` -package main +package examples import ( "fmt" "github.com/brazzcore/mocai/pkg/mocai/constants" "github.com/brazzcore/mocai/pkg/mocai/entities/address" + "github.com/brazzcore/mocai/pkg/mocai/entities/certificate" + "github.com/brazzcore/mocai/pkg/mocai/entities/company" "github.com/brazzcore/mocai/pkg/mocai/entities/person" "github.com/brazzcore/mocai/pkg/mocai/entities/phone" "github.com/brazzcore/mocai/pkg/mocai/translations" ) -func main() { - // Set the language to pt-BR +func GenerateMockExample() { + // Set the language to pt-BR translations.SetLanguage("ptbr") // Generate mock data @@ -70,18 +72,37 @@ func main() { fmt.Print(err) } - fmt.Printf("Person: %s %s, %s, %d years old\n", - person_mock.FirstNameMale, person_mock.LastName, person_mock.Gender, person_mock.Age) + company_mock, err := company.GenerateCompany(false) + if err != nil { + fmt.Print(err) + return + } + + certificate_mock, err := certificate.GenerateCertificate(false) + if err != nil { + fmt.Print(err) + return + } + + fmt.Printf("Person: %s %s, %s, %d years old, CPF: %s\n", + person_mock.FirstNameMale, person_mock.LastName, person_mock.Gender, person_mock.Age, person_mock.CPF) + + fmt.Printf("Birth Certificate: %s\n", certificate_mock.BrazilianCertificates.BirthCertificate.CertificateNumber) + + fmt.Printf("Marriage Certificate: %s\n", certificate_mock.BrazilianCertificates.MarriageCertificate.CertificateNumber) + + fmt.Printf("Death Certificate: %s\n", certificate_mock.BrazilianCertificates.DeathCertificate.CertificateNumber) + + fmt.Printf("Company: %s, CNPJ: %s\n", company_mock.BrazilianCompany.CompanyName, company_mock.BrazilianCompany.CNPJ) fmt.Printf("Address: %s, %d - %s, %s (%s) - %s\n", address_mock.Street, address_mock.Number, address_mock.City, address_mock.State, address_mock.UF, address_mock.ZIP) - fmt.Printf("Phone: (%s) %s\n", phone_mock.AreaCode, phone_mock.Number) } ``` ### Examples -The ***examples*** folder contains samples of how to use the library. To run the examples, navigate to the folder and execute: +The ***examples*** folder contains samples of how to use the library. To run the examples, navigate to the root folder and execute: ``` go run main.go diff --git a/docs/localization/pt/README-PT.md b/docs/localization/pt/README-PT.md index 6d55d5d..255da40 100644 --- a/docs/localization/pt/README-PT.md +++ b/docs/localization/pt/README-PT.md @@ -11,17 +11,17 @@ Uma biblioteca Go para geração de dados de teste, permitindo criar mocks de en O nome Mocai é uma homenagem à iniciativa brasileira por trás da biblioteca. Ele surgiu da combinação de "mock" (termo em inglês para simulação ou dados fictícios) com "açaí", uma fruta típica da Amazônia brasileira, conhecida por sua energia e versatilidade. Assim como o açaí é essencial para muitos brasileiros, o Mocai busca ser uma ferramenta essencial para desenvolvedores que precisam de dados de teste eficientes e de qualidade. 🇧🇷 ## 🛠️ Principais Recursos -- Geração de Dados Aleatórios: Crie mocks de entidades com dados variados e realistas. -- Consistência: Garanta que os dados gerados sejam consistentes e adequados para testes. -- Facilidade de Uso: Interface simples e intuitiva para integração rápida em seus projetos. -- Extensibilidade: Adicione novas entidades ou personalize as existentes conforme suas necessidades. -- Open Source: Colabore, sugira melhorias e contribua para o crescimento da biblioteca. +- **Geração de Dados Aleatórios:** Crie mocks de entidades com dados variados e realistas. +- **Consistência:** Garanta que os dados gerados sejam consistentes e adequados para testes. +- **Facilidade de Uso:** Interface simples e intuitiva para integração rápida em seus projetos. +- **Extensibilidade:** Adicione novas entidades ou personalize as existentes conforme suas necessidades. +- **Open Source:** Colabore, sugira melhorias e contribua para o crescimento da biblioteca. ## 🚀 Por que usar o Mocai? -- Produtividade: Reduza o tempo gasto na criação de dados de teste. -- Qualidade: Melhore a cobertura e a eficácia dos seus testes com dados realistas. -- Flexibilidade: Adapte os mocks às necessidades específicas do seu projeto. -- Comunidade: Faça parte de uma comunidade open-source que valoriza a colaboração e a inovação. +- **Produtividade:** Reduza o tempo gasto na criação de dados de teste. +- **Qualidade:** Melhore a cobertura e a eficácia dos seus testes com dados realistas. +- **Flexibilidade:** Adapte os mocks às necessidades específicas do seu projeto. +- **Comunidade:** Faça parte de uma comunidade open-source que valoriza a colaboração e a inovação. ## 🚀 Como Começar @@ -36,29 +36,73 @@ Uso Básico Importe a biblioteca em seu projeto e comece a gerar mocks: ``` -package main +package examples import ( - "fmt" - "github.com/brazzcore/mocai/pkg/mocai" - + "fmt" + + "github.com/brazzcore/mocai/pkg/mocai/constants" + "github.com/brazzcore/mocai/pkg/mocai/entities/address" + "github.com/brazzcore/mocai/pkg/mocai/entities/certificate" + "github.com/brazzcore/mocai/pkg/mocai/entities/company" + "github.com/brazzcore/mocai/pkg/mocai/entities/person" + "github.com/brazzcore/mocai/pkg/mocai/entities/phone" + "github.com/brazzcore/mocai/pkg/mocai/translations" ) -func main() { - // Gerar um mock em português (pt-br) - mock := mocai.GenerateMocai("pt-br") +func GenerateMockExample() { + // Defina o idioma para pt-BR + translations.SetLanguage("ptbr") + + // Gerar dados mock + person_mock, err := person.GeneratePerson() + if err != nil { + fmt.Print(err) + } + + address_mock, err := address.GenerateAddress() + if err != nil { + fmt.Print(err) + } + + phone_mock, err := phone.GeneratePhone() + if err != nil { + fmt.Print(err) + } + + company_mock, err := company.GenerateCompany(false) + if err != nil { + fmt.Print(err) + return + } + + certificate_mock, err := certificate.GenerateCertificate(false) + if err != nil { + fmt.Print(err) + return + } + + fmt.Printf("Person: %s %s, %s, %d years old, CPF: %s\n", + person_mock.FirstNameMale, person_mock.LastName, person_mock.Gender, person_mock.Age, person_mock.CPF) + + fmt.Printf("Birth Certificate: %s\n", certificate_mock.BrazilianCertificates.BirthCertificate.CertificateNumber) + + fmt.Printf("Marriage Certificate: %s\n", certificate_mock.BrazilianCertificates.MarriageCertificate.CertificateNumber) + + fmt.Printf("Death Certificate: %s\n", certificate_mock.BrazilianCertificates.DeathCertificate.CertificateNumber) + + fmt.Printf("Company: %s, CNPJ: %s\n", company_mock.BrazilianCompany.CompanyName, company_mock.BrazilianCompany.CNPJ) - fmt.Println("Pessoa:", mock.Person.FirstName, mock.Person.LastName) - fmt.Println("Endereço:", mock.Address.Street, mock.Address.Number) - fmt.Println("Telefone:", mock.Phone.AreaCode, mock.Phone.Number) + fmt.Printf("Address: %s, %d - %s, %s (%s) - %s\n", + address_mock.Street, address_mock.Number, address_mock.City, address_mock.State, address_mock.UF, address_mock.ZIP) + fmt.Printf("Phone: (%s) %s\n", phone_mock.AreaCode, phone_mock.Number) } ``` ### Exemplos -A pasta ***examples*** contém exemplos de como usar a biblioteca. Para executar os exemplos, navegue até a pasta e execute: +A pasta ***examples*** contém exemplos de como usar a biblioteca. Para executar os exemplos, navegue até a pasta raiz e execute: ``` -cd examples go run main.go ``` diff --git a/examples/mock_example.go b/examples/mock_example.go index 7c98fdc..b1bf13a 100644 --- a/examples/mock_example.go +++ b/examples/mock_example.go @@ -5,6 +5,7 @@ import ( "github.com/brazzcore/mocai/pkg/mocai/constants" "github.com/brazzcore/mocai/pkg/mocai/entities/address" + "github.com/brazzcore/mocai/pkg/mocai/entities/certificate" "github.com/brazzcore/mocai/pkg/mocai/entities/company" "github.com/brazzcore/mocai/pkg/mocai/entities/person" "github.com/brazzcore/mocai/pkg/mocai/entities/phone" @@ -31,9 +32,15 @@ func GenerateMockExample() { fmt.Print(err) } - company_mock, err := company.GenerateCompany() + company_mock, err := company.GenerateCompany(false) if err != nil { - fmt.Println("Error generating company:", err) + fmt.Print(err) + return + } + + certificate_mock, err := certificate.GenerateCertificate(false) + if err != nil { + fmt.Print(err) return } @@ -43,6 +50,12 @@ func GenerateMockExample() { fmt.Printf("Person: %s %s, %s, %d years old, CPF: %s\n", person_mock.FirstNameMale, person_mock.LastName, person_mock.Gender, person_mock.Age, person_mock.CPF) + fmt.Printf("Birth Certificate: %s\n", certificate_mock.BrazilianCertificates.BirthCertificate.CertificateNumber) + + fmt.Printf("Marriage Certificate: %s\n", certificate_mock.BrazilianCertificates.MarriageCertificate.CertificateNumber) + + fmt.Printf("Death Certificate: %s\n", certificate_mock.BrazilianCertificates.DeathCertificate.CertificateNumber) + fmt.Printf("Company: %s, CNPJ: %s\n", company_mock.BrazilianCompany.CompanyName, company_mock.BrazilianCompany.CNPJ) fmt.Printf("Address: %s, %d - %s, %s (%s) - %s\n", diff --git a/pkg/mocai/entities/certificate/countries/brazilian_certificates.go b/pkg/mocai/entities/certificate/countries/brazilian_certificates.go new file mode 100644 index 0000000..6b61c23 --- /dev/null +++ b/pkg/mocai/entities/certificate/countries/brazilian_certificates.go @@ -0,0 +1,258 @@ +package countries + +import ( + "fmt" + "math/rand" + "time" +) + +// Brazilian certificate types +// 1 - for birth certificate +// 2 - for marriage certificate +// 3 - for death certificate +const ( + brazilianBirthCertificateType = 1 + brazilianMarriageCertificateType = 2 + brazilianDeathCertificateType = 3 +) + +// BaseCertificate is the base structure for all brazilian certificates +type BaseCertificate struct { + VitalRecordsOffice int + ArchiveCode int + ServiceType int + BirthYear int + CertificateType int + BookNumber int + PageNumber int + TermNumber int + CheckDigits string + CertificateNumber string +} + +// BirthCertificate represents a brazilian birth certificate +type BirthCertificate struct { + BaseCertificate +} + +// MarriageCertificate represents a brazilian marriage certificate +type MarriageCertificate struct { + BaseCertificate +} + +// DeathCertificate represents a brazilian death certificate +type DeathCertificate struct { + BaseCertificate +} + +// BrazilianCertificates represents all brazilian certificates +type BrazilianCertificates struct { + BirthCertificate *BirthCertificate + MarriageCertificate *MarriageCertificate + DeathCertificate *DeathCertificate +} + +// GenerateBrazilianCertificates generates a valid brazilian certificates +// If formatted is true, returns the number with separators (-) +// Returns a pointer to BrazilianCertificates and error if any validation fails +func GenerateBrazilianCertificates(formatted bool) (*BrazilianCertificates, error) { + createdBirthCertificate, err := generateBirthCertificate(formatted) + if err != nil { + return nil, err + } + + createdMarriageCertificate, err := generateMarriageCertificate(formatted) + if err != nil { + return nil, err + } + + createdDeathCertificate, err := generateDeathCertificate(formatted) + if err != nil { + return nil, err + } + + createdBrazilianCertificates := &BrazilianCertificates{ + BirthCertificate: createdBirthCertificate, + MarriageCertificate: createdMarriageCertificate, + DeathCertificate: createdDeathCertificate, + } + + return createdBrazilianCertificates, nil +} + +// generateCertificates generates a valid brazilian certificate +// If formatted is true, returns the number with separators (-) +// certificateType is the type of certificate [1 - for birth certificate, 2 - for marriage certificate, 3 - for death certificate] +// Returns a pointer to BaseCertificate and error if any validation fails +func generateCertificate(formatted bool, certificateType int) (*BaseCertificate, error) { + // Registry Office + // 1. Vital Records Office [6 digits] + vitalRecordsOffice := generateRandomNumber(100000, 899999) + if vitalRecordsOffice < 0 { + return nil, ErrInvalidVitalRecordsOffice + } + + // 2. Archive [2 digits] + archiveCode := 1 + + // 3. Civil Registry of Natural Persons [2 digits] + serviceType := 55 + + // 4. Birth Year [4 digits] + birthYear := generateRandomYear(2010) + + // 5. Certificate type [1 digit] + //certificateType + + // 6. Book number [5 digits] + bookNumber := generateRandomNumber(10000, 89999) + if bookNumber < 0 { + return nil, ErrInvalidBookNumber + } + + // 7. Page number [3 digits] + pageNumber := generateRandomNumber(100, 899) + if pageNumber < 0 { + return nil, ErrInvalidPageNumber + } + + // 8. Term number [7 digits] + termNumber := generateRandomNumber(1000000, 8999999) + if termNumber < 0 { + return nil, ErrInvalidTermNumber + } + + // Number without check digits [30 digits] + numberWithoutCheckDigits := fmt.Sprintf("%06d%02d%02d%04d%d%05d%03d%07d", + vitalRecordsOffice, archiveCode, serviceType, birthYear, certificateType, bookNumber, pageNumber, termNumber) + if len(numberWithoutCheckDigits) != 30 { + return nil, ErrInvalidNumberWithoutCheckDigits + } + + // 9. Check digits calculation [2 digits] + checkDigits := calculateCheckDigits(numberWithoutCheckDigits) + + certificateNumber := fmt.Sprintf("%s%02s", numberWithoutCheckDigits, checkDigits) + if formatted { + certificateNumber = fmt.Sprintf("%06d %02d %02d %04d %d %05d %03d %07d-%02s", + vitalRecordsOffice, archiveCode, serviceType, birthYear, certificateType, bookNumber, pageNumber, termNumber, checkDigits) + } + + if certificateNumber == "" { + return nil, ErrInvalidCertificate + } + + createdBaseCertificate := &BaseCertificate{ + VitalRecordsOffice: vitalRecordsOffice, + ArchiveCode: archiveCode, + ServiceType: serviceType, + BirthYear: birthYear, + CertificateType: certificateType, + BookNumber: bookNumber, + PageNumber: pageNumber, + TermNumber: termNumber, + CheckDigits: checkDigits, + CertificateNumber: certificateNumber, + } + + return createdBaseCertificate, nil +} + +// generateBirthCertificate generates a valid Brazilian birth certificate +func generateBirthCertificate(formatted bool) (*BirthCertificate, error) { + base, err := generateCertificate(formatted, brazilianBirthCertificateType) + if err != nil { + return nil, err + } + + createdBirthCertificate := &BirthCertificate{ + BaseCertificate: *base, + } + + return createdBirthCertificate, nil +} + +// generateMarriageCertificate generates a valid Brazilian marriage certificate +func generateMarriageCertificate(formatted bool) (*MarriageCertificate, error) { + base, err := generateCertificate(formatted, brazilianMarriageCertificateType) + if err != nil { + return nil, err + } + + createdMarriageCertificate := &MarriageCertificate{ + BaseCertificate: *base, + } + + return createdMarriageCertificate, nil +} + +// generateDeathCertificate generates a valid Brazilian death certificate +func generateDeathCertificate(formatted bool) (*DeathCertificate, error) { + base, err := generateCertificate(formatted, brazilianDeathCertificateType) + if err != nil { + return nil, err + } + + createdDeathCertificate := &DeathCertificate{ + BaseCertificate: *base, + } + + return createdDeathCertificate, nil +} + +// generateRandomNumber generates a random number between min and max +func generateRandomNumber(min, max int) int { + return rand.Intn(max-min+1) + min +} + +// generateRandomYear generates a random year between startYear and the current year +func generateRandomYear(startYear int) int { + currentYear := time.Now().Year() + return rand.Intn(currentYear-startYear+1) + startYear +} + +// calculateCheckDigits calculates the check digits for the birth certificate number +// using a weight-based algorithm / using Mod 11 +func calculateCheckDigits(number string) string { + dv1Weights := [30]int{ + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, + } + + sumDV1 := 0 + for i := 0; i < 30; i++ { + // reverse access: b1 = last digit [position 29], b30 = first [position 0] + digit := int(number[29-i] - '0') + sumDV1 += digit * dv1Weights[i] + } + + dv1 := sumDV1 % 11 + if dv1 == 10 { + dv1 = 1 + } + + dv2Weights := [31]int{ + 9, // first term: dv1 * 9 + 8, 7, 6, 5, 4, 3, 2, 1, 0, + 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + } + + sumDV2 := 0 + // first term: dv1 * 9 + sumDV2 += dv1 * dv2Weights[0] + + // remaining terms: b1 to b30 with remaining weights + for i := 0; i < 30; i++ { + digit := int(number[29-i] - '0') + sumDV2 += digit * dv2Weights[i+1] + } + + dv2 := sumDV2 % 11 + if dv2 == 10 { + dv2 = 1 + } + + return fmt.Sprintf("%d%d", dv1, dv2) +} diff --git a/pkg/mocai/entities/certificate/countries/errors.go b/pkg/mocai/entities/certificate/countries/errors.go new file mode 100644 index 0000000..88fd04a --- /dev/null +++ b/pkg/mocai/entities/certificate/countries/errors.go @@ -0,0 +1,18 @@ +package countries + +import "errors" + +// Errors for Certificate data generation failures. +// These errors represent specific failure scenarios and should be wrapped with additional +// context when returned. +var ( + ErrInvalidCertificate = errors.New("invalid certificate") + ErrInvalidVitalRecordsOffice = errors.New("invalid vital records office number") + ErrInvalidArchive = errors.New("invalid archive number") + ErrInvalidVitalRecordsService = errors.New("invalid vital records service number") + ErrInvalidBirthYear = errors.New("invalid birth year") + ErrInvalidBookNumber = errors.New("invalid book number") + ErrInvalidPageNumber = errors.New("invalid page number") + ErrInvalidTermNumber = errors.New("invalid term number") + ErrInvalidNumberWithoutCheckDigits = errors.New("invalid number without check digits") +) diff --git a/pkg/mocai/entities/certificate/countries/validator.go b/pkg/mocai/entities/certificate/countries/validator.go new file mode 100644 index 0000000..92d6ce5 --- /dev/null +++ b/pkg/mocai/entities/certificate/countries/validator.go @@ -0,0 +1,37 @@ +package countries + +import ( + "regexp" + "strings" +) + +// ValidateBirthCertificate checks if a Brazilian birth certificate number is valid +// It validates the format, length, and check digits of the certificate number +func ValidateBirthCertificate(certificate string) bool { + // Remove any formatting + certificate = strings.ReplaceAll(certificate, "-", "") + certificate = strings.ReplaceAll(certificate, " ", "") + + // Check if the certificate number has exactly 32 digits + if len(certificate) != 32 { + return false + } + + // Verify that the certificate contains only numeric characters + match, _ := regexp.MatchString("^[0-9]+$", certificate) + if !match { + return false + } + + // Extract the number without check digits + number := certificate[:30] + + // Get the informed check digits (last 2 digits) + informedCheckDigit := certificate[30:] + + // Calculate the expected check digits + calculatedCheckDigit := calculateCheckDigits(number) + + // Compare the informed check digits with the calculated ones + return informedCheckDigit == calculatedCheckDigit +} diff --git a/pkg/mocai/entities/certificate/generator.go b/pkg/mocai/entities/certificate/generator.go new file mode 100644 index 0000000..780a8b9 --- /dev/null +++ b/pkg/mocai/entities/certificate/generator.go @@ -0,0 +1,20 @@ +package certificate + +import "github.com/brazzcore/mocai/pkg/mocai/entities/certificate/countries" + +// Certificate represents all certificates available +type Certificate struct { + BrazilianCertificates *countries.BrazilianCertificates +} + +// GenerateCertificate generates all certificates available. +// If formatted is true, returns the number with separators (-). +// Returns a pointer to Certificate and error if any validation fails +func GenerateCertificate(formatted bool) (*Certificate, error) { + createdBrazilianCertificates, err := countries.GenerateBrazilianCertificates(formatted) + if err != nil { + return nil, err + } + + return &Certificate{BrazilianCertificates: createdBrazilianCertificates}, nil +} diff --git a/pkg/mocai/entities/company/countries/brazilian_company.go b/pkg/mocai/entities/company/countries/brazilian_company.go index 8563550..55e1701 100644 --- a/pkg/mocai/entities/company/countries/brazilian_company.go +++ b/pkg/mocai/entities/company/countries/brazilian_company.go @@ -19,7 +19,7 @@ type BrazilianCompany struct { var rng = rand.New(rand.NewSource(time.Now().UnixNano())) -func GenerateBrazilianCompany() (*BrazilianCompany, error) { +func GenerateBrazilianCompany(formatted bool) (*BrazilianCompany, error) { lang := translations.GetLanguage() // Get the list of company names @@ -34,7 +34,7 @@ func GenerateBrazilianCompany() (*BrazilianCompany, error) { companyName := companyNames[rng.Intn(len(companyNames))] // Generate a random CNPJ without a mask - cnpj, err := cnpj.GenerateCNPJ(false) + cnpj, err := cnpj.GenerateCNPJ(formatted) if err != nil { return nil, err } @@ -45,7 +45,7 @@ func GenerateBrazilianCompany() (*BrazilianCompany, error) { } if cnpj == "" { - return nil, fmt.Errorf("%s: CNPJ is empty", ErrGeneratingBrazilianCompany) + return nil, fmt.Errorf("%s: CNPJ is empty", ErrGeneratingCNPJ) } createdCompany := &BrazilianCompany{ diff --git a/pkg/mocai/entities/company/countries/errors.go b/pkg/mocai/entities/company/countries/errors.go index f2e6fc9..701602a 100644 --- a/pkg/mocai/entities/company/countries/errors.go +++ b/pkg/mocai/entities/company/countries/errors.go @@ -2,9 +2,10 @@ package countries import "errors" -// Error constants for Company data generation failures. +// Errors for Company data generation failures. // These errors represent specific failure scenarios and should be wrapped with additional // context when returned. var ( ErrGeneratingBrazilianCompany = errors.New("error generating brazilian company") + ErrGeneratingCNPJ = errors.New("error generating CNPJ") ) diff --git a/pkg/mocai/entities/company/countries/generator_test.go b/pkg/mocai/entities/company/countries/generator_test.go index 6b51ce5..39f968d 100644 --- a/pkg/mocai/entities/company/countries/generator_test.go +++ b/pkg/mocai/entities/company/countries/generator_test.go @@ -7,7 +7,7 @@ import ( ) func TestGenerateCompany(t *testing.T) { - company, err := GenerateBrazilianCompany() + company, err := GenerateBrazilianCompany(false) if err != nil { t.Fatalf("Failed to generate company: %v", err) } @@ -18,7 +18,7 @@ func TestGenerateCompany(t *testing.T) { } func TestIfCompanyHasAValidCNPJ(t *testing.T) { - company, err := GenerateBrazilianCompany() + company, err := GenerateBrazilianCompany(false) if err != nil { t.Fatalf("Failed to generate company: %v", err) } diff --git a/pkg/mocai/entities/company/generator.go b/pkg/mocai/entities/company/generator.go index 5dc0fb0..2404578 100644 --- a/pkg/mocai/entities/company/generator.go +++ b/pkg/mocai/entities/company/generator.go @@ -8,8 +8,8 @@ type Company struct { } // GenerateCompany generates all companies available. -func GenerateCompany() (*Company, error) { - createdCompanyBrazilian, err := countries.GenerateBrazilianCompany() +func GenerateCompany(formatted bool) (*Company, error) { + createdCompanyBrazilian, err := countries.GenerateBrazilianCompany(formatted) if err != nil { return nil, err diff --git a/pkg/mocai/generator/interface.go b/pkg/mocai/generator/interface.go deleted file mode 100644 index 1ca254f..0000000 --- a/pkg/mocai/generator/interface.go +++ /dev/null @@ -1,5 +0,0 @@ -package generator - -// Generator is an interface that defines the signature of a data generation function. -// It returns a value of type `interface{}`, allowing flexibility in the type of data generated. -type Generator func() interface{}