package national import ( "backend/pkg/errors" "strconv" "strings" ) func IsValid(value string) (bool, error) { valueCount := len(value) if valueCount < 8 { return false, errors.ErrNationalIDInvalid } if valueCount >= 8 && valueCount < 10 { value = strings.Repeat("0", 10-valueCount) + value } var valueSlices []uint8 for _, s := range value { i, err := strconv.ParseInt(string(s), 10, 8) if err != nil { return false, errors.ErrNationalIDInvalid } valueSlices = append(valueSlices, uint8(i)) } s := calculateNationalIDNumbers(&valueSlices) s %= 11 l := valueSlices[len(value)-1] if (s < 2 && s != int(l)) || (s >= 2 && int(l) != 11-s) { return false, errors.ErrNationalIDInvalid } return true, nil } func calculateNationalIDNumbers(valueSlices *[]uint8) (sum int) { var i uint8 for i = 10; i >= 2; i-- { sum += int(i * (*valueSlices)[10-i]) } return sum }