diff --git a/cmd/user/create.go b/cmd/user/create.go index 03dd0ba1aeee370f106b6b171b2fd063b03d0717..429e1c363e438b9717bd1ddfed88ab0ebe1bdb2c 100644 --- a/cmd/user/create.go +++ b/cmd/user/create.go @@ -214,48 +214,65 @@ func genGecos(u model.User) model.User { return u } -// honestly... i had 3 functions that had a similar algorithm -// and one that only redirected the flow. so i took it as a -// challenge to merge them into one :D this it the result. -// don't even bother trying to understand it, just go back -// a few commits and read there -func genLogin(name, grr, ltype string, variance int) string { - fix := 1 - login := "" - var solo string - parts := formatName(name) - - if len(parts) <= 1 { - if ltype != "ini" || len(parts) == 0 { - return "_" - } - } - - if ltype == "first" { - login, parts, fix = parts[0], parts[1:], 0 - variance++ - } +type LoginType int - if ltype == "last" { - solo, parts = parts[len(parts)-1], parts[:len(parts)-1] - } +const ( + Initials LoginType = iota + FirstName + LastName +) - x := variance / len(parts) - y := variance % len(parts) +func genLogin(name string, grr string, ltype LoginType, variance int) string { + parts := formatName(name) + if len(parts) == 0 { + return "_" + } - for i := range parts { - if y != 0 { - login += parts[i][:x+1+fix] - y-- - } else { - login += parts[i][:x+fix] - } - } + part_prefix_len := make([]int, len(parts)) + if ltype == Initials { + // a primeira letra de cada parte deve aparecer + for i := 0; i < len(parts); i++ { + part_prefix_len[i] = 1 + } + } else if ltype == FirstName { + // a primeira parte inteira deve aparecer + part_prefix_len[0] = len(parts[0]) + } else { + // a primeira letra de cada parte deve aparecer + for i := 0; i < len(parts); i++ { + part_prefix_len[i] = 1 + } + // assim com a parte final do nome + part_prefix_len[len(parts)-1] = len(parts[len(parts)-1]) + } + part_prefix_ix := 0 + for i := 0; i < variance; i++ { + ok := false + for k := 0; k < len(parts) && !ok; k++ { + if part_prefix_len[part_prefix_ix] < len(parts[part_prefix_ix]) { + part_prefix_len[part_prefix_ix]++ + ok = true + } + part_prefix_ix = (part_prefix_ix + 1) % len(parts) + } + if !ok { + // acabou o que fazer, vamos abandonar porque não vai mudar mais nada + break + } + } - if ltype == "ini" { login += grr[2:4] } - if ltype == "last" { login += solo } + login := "" + for i := 0; i < len(parts); i++ { + login += parts[i][:part_prefix_len[i]] + } + if login == "" { + return "_" + } - return login + if ltype == Initials { + login += grr[2:4] + } + return login } // removes connectives, leave all lowecase and splits the name @@ -274,10 +291,18 @@ func formatName(name string) []string { return parts } -func genUniqueUID(name, grr, ltype string, users []model.User) (string, error) { +func genUniqueUID(name, grr string, ltypeString string, users []model.User) (string, error) { var uid string used, variance := true, 0 for used { + var ltype LoginType + if ltypeString == "ini" { + ltype = Initials + } else if ltypeString == "first" { + ltype = FirstName + } else { + ltype = LastName + } uid = genLogin(name, grr, ltype, variance) // already taken or alias for it exists :( @@ -517,6 +542,14 @@ func validateStatus(status string) error { return nil } +func validateLtype(ltype string) error { + if ltype != "ini" && ltype != "first" && ltype != "last" { + err := fmt.Errorf("Login type can only be \"ini\", \"first\" or \"last\"") + return err + } + return nil +} + func validateGRR(grr string) error { // OK if empty, only "ini" login type requires it and we check :) if grr == "_" { return nil } @@ -580,6 +613,11 @@ func validateInputs(opts model.Opts) error { err = validateStatus(opts.Status) if err != nil { return err } + err = validateLtype(opts.Ltype) + if err != nil { + return err + } + // it’s OK if UID is empty here, we generate it later :) if opts.UID != "" { err := validateUID(opts.UID) diff --git a/cmd/user/create_test.go b/cmd/user/create_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ae52d43af451c8d84f575147da6a82ad48a022e3 --- /dev/null +++ b/cmd/user/create_test.go @@ -0,0 +1,110 @@ +package user + +import ( + "reflect" + "testing" +) + +func assertEqual(t *testing.T, a any, b any) { + if !reflect.DeepEqual(a, b) { + t.Fatalf("%s != %s", a, b) + } +} + +func TestGenLogin(t *testing.T) { + assertEqual(t, genLogin("", "20241982", Initials, 0), "_") + assertEqual(t, genLogin("", "20241982", Initials, 1), "_") + assertEqual(t, genLogin("", "20241982", Initials, 2), "_") + assertEqual(t, genLogin("", "20241982", Initials, 3), "_") + + assertEqual(t, genLogin("", "20241982", FirstName, 0), "_") + assertEqual(t, genLogin("", "20241982", FirstName, 1), "_") + assertEqual(t, genLogin("", "20241982", FirstName, 2), "_") + assertEqual(t, genLogin("", "20241982", FirstName, 3), "_") + + assertEqual(t, genLogin("", "20241982", LastName, 0), "_") + assertEqual(t, genLogin("", "20241982", LastName, 1), "_") + assertEqual(t, genLogin("", "20241982", LastName, 2), "_") + assertEqual(t, genLogin("", "20241982", LastName, 3), "_") + + assertEqual(t, genLogin("de", "20241982", Initials, 0), "_") + assertEqual(t, genLogin("de", "20241982", Initials, 1), "_") + assertEqual(t, genLogin("de", "20241982", Initials, 2), "_") + assertEqual(t, genLogin("de", "20241982", Initials, 3), "_") + + assertEqual(t, genLogin("de", "20241982", FirstName, 0), "_") + assertEqual(t, genLogin("de", "20241982", FirstName, 1), "_") + assertEqual(t, genLogin("de", "20241982", FirstName, 2), "_") + assertEqual(t, genLogin("de", "20241982", FirstName, 3), "_") + + assertEqual(t, genLogin("de", "20241982", LastName, 0), "_") + assertEqual(t, genLogin("de", "20241982", LastName, 1), "_") + assertEqual(t, genLogin("de", "20241982", LastName, 2), "_") + assertEqual(t, genLogin("de", "20241982", LastName, 3), "_") + + assertEqual(t, genLogin("da de", "20241982", Initials, 0), "_") + assertEqual(t, genLogin("da de", "20241982", Initials, 1), "_") + assertEqual(t, genLogin("da de", "20241982", Initials, 2), "_") + assertEqual(t, genLogin("da de", "20241982", Initials, 3), "_") + + assertEqual(t, genLogin("da de", "20241982", FirstName, 0), "_") + assertEqual(t, genLogin("da de", "20241982", FirstName, 1), "_") + assertEqual(t, genLogin("da de", "20241982", FirstName, 2), "_") + assertEqual(t, genLogin("da de", "20241982", FirstName, 3), "_") + + assertEqual(t, genLogin("da de", "20241982", LastName, 0), "_") + assertEqual(t, genLogin("da de", "20241982", LastName, 1), "_") + assertEqual(t, genLogin("da de", "20241982", LastName, 2), "_") + assertEqual(t, genLogin("da de", "20241982", LastName, 3), "_") + + assertEqual(t, genLogin("Fabiano", "20241982", Initials, 0), "f24") + assertEqual(t, genLogin("Fabiano", "20241982", Initials, 1), "fa24") + assertEqual(t, genLogin("Fabiano", "20241982", Initials, 2), "fab24") + assertEqual(t, genLogin("Fabiano", "20241982", Initials, 3), "fabi24") + + assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 0), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 1), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 2), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 3), "fabiano") + + assertEqual(t, genLogin("Fabiano", "20241982", LastName, 0), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", LastName, 1), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", LastName, 2), "fabiano") + assertEqual(t, genLogin("Fabiano", "20241982", LastName, 3), "fabiano") + + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 0), "faps24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 1), "faaps24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 2), "faanps24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 3), "faanpes24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 14), "fabiaantunperesouz24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 18), "fabianantunepereisouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 19), "fabianantunepereirsouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 20), "fabianoantunepereirsouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 21), "fabianoantunespereirsouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 22), "fabianoantunespereirasouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 40), "fabianoantunespereirasouza24") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 50), "fabianoantunespereirasouza24") + + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 0), "fabiano") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 1), "fabianoa") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 2), "fabianoap") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 3), "fabianoaps") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 4), "fabianoanps") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 16), "fabianoantunepereisouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 17), "fabianoantunepereirsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 18), "fabianoantunespereirsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 19), "fabianoantunespereirasouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 20), "fabianoantunespereirasouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 50), "fabianoantunespereirasouza") + + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 0), "fapsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 1), "faapsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 2), "faanpsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 3), "faanpesouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 15), "fabianantunepereirsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 16), "fabianoantunepereirsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 17), "fabianoantunespereirsouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 18), "fabianoantunespereirasouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 19), "fabianoantunespereirasouza") + assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 100), "fabianoantunespereirasouza") +}