-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcpf.go
72 lines (63 loc) · 1.8 KB
/
cpf.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//
// Autor: Marcelo Gomes Jr <[email protected]>
// Criado: abr/2020
//
// cpfcnpj
//
package cpfcnpj
import (
"errors"
)
const (
cpfPattern = `^\d{3}\.\d{3}\.\d{3}-\d{2}$`
cpfSize = 11
cpfFormattedSize = 14
)
var (
ErrCPFInvalidFormat = errors.New("o cpf deve ter 11 digitos (ou 14 com pontuação)")
ErrCPFInvalid = errors.New("cpf inválido")
)
// CPF representa o documento Cadastro de Pessoas Físicas, registro
// mantido pela Receita Federal do Brail
//
// Não é necessário utilizar as funções 'NewCPF' ou 'NewValidCPF', elas
// são apenas helpers. É possível criar um objeto CPF diretamente com uma
// simples conversão (cpfcnpj.CPF("11144477735") ou cpfcnpj.CPF("111.444.777-35"))
type CPF string
// NewValidCPF retorna um CPF baseado na string informada caso ele seja válido
func NewValidCPF(v string) (CPF, error) {
if !patternOrSize(v, cpfPattern, cpfSize) {
return "", ErrCPFInvalidFormat
}
cpf := CPF(v)
if !cpf.IsValid() {
return "", ErrCPFInvalid
}
return cpf, nil
}
// IsValid checa se o CPF é válido checando através de um algoritmo
// se os dois últimos digitos são válidos de acordo com o resto
// da string
func (c *CPF) IsValid() bool {
return isValid(string(*c), cpfSize, cpfFormattedSize)
}
// Format formata o CPF no padrão "999.999.999-99" e retorna
// erro caso ocorra algum problema durante o processo
func (c *CPF) Format() error {
v, err := format(string(*c), cpfPattern, cpfSize, ErrCPFInvalidFormat)
if err != nil {
return err
}
*c = CPF(v)
return nil
}
// Unformat remove a pontuação ("99999999999") do CPF e
// retorna erro caso ocorra algum problema durante o processo
func (c *CPF) Unformat() error {
v, err := unformat(string(*c), cpfSize, ErrCPFInvalidFormat)
if err != nil {
return err
}
*c = CPF(v)
return nil
}