github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/parser/parser.go (about)

     1  package parser
     2  
     3  import "github.com/beevik/etree"
     4  
     5  //Rule é o tipo de dados que faz o de-para de uma query na mensagem para uma key no dicionário de valores
     6  type Rule struct {
     7  	XMLQuery string
     8  	MapKey   string
     9  }
    10  
    11  //TranslatorMap contem as regras de tradução e extração de uma mensagem
    12  type TranslatorMap struct {
    13  	rules []Rule
    14  }
    15  
    16  //AddRule adiciona uma regra nova no objeto de tradução
    17  func (t *TranslatorMap) AddRule(r Rule) {
    18  	t.rules = append(t.rules, r)
    19  }
    20  
    21  //GetRules retorna todas as regras do tradutor
    22  func (t *TranslatorMap) GetRules() []Rule {
    23  	return t.rules
    24  }
    25  
    26  //NewTranslatorMap cria uma novo objeto de tradução
    27  func NewTranslatorMap() *TranslatorMap {
    28  	t := TranslatorMap{}
    29  	t.rules = make([]Rule, 0, 0)
    30  	return &t
    31  }
    32  
    33  //ParseXML executa o parse do XML e retorna uma estrutura de arvore do documento
    34  func ParseXML(xmlDoc string) (*etree.Document, error) {
    35  	doc := etree.NewDocument()
    36  	if err := doc.ReadFromString(xmlDoc); err != nil {
    37  		return etree.NewDocument(), err
    38  	}
    39  	return doc, nil
    40  }
    41  
    42  //ExtractValuesFromXML extrai os valores do documento de acordo com uma lista de regras de "de-para"
    43  func ExtractValuesFromXML(doc *etree.Document, translate *TranslatorMap) map[string]string {
    44  	values := make(map[string]string)
    45  	for _, rule := range translate.rules {
    46  		for _, t := range doc.FindElements(rule.XMLQuery) {
    47  			values[rule.MapKey] = t.Text()
    48  			break
    49  		}
    50  	}
    51  	return values
    52  }
    53  
    54  // ExtractValues extrai valores de uma string
    55  func ExtractValues(xmlDoc string, translator *TranslatorMap) (map[string]string, error) {
    56  	doc, err := ParseXML(xmlDoc)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	return ExtractValuesFromXML(doc, translator), nil
    61  }