reader.go 789 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package geoip
  2. import (
  3. "net/netip"
  4. E "github.com/sagernet/sing/common/exceptions"
  5. "github.com/oschwald/maxminddb-golang"
  6. )
  7. type Reader struct {
  8. reader *maxminddb.Reader
  9. }
  10. func Open(path string) (*Reader, []string, error) {
  11. database, err := maxminddb.Open(path)
  12. if err != nil {
  13. return nil, nil, err
  14. }
  15. if database.Metadata.DatabaseType != "sing-geoip" {
  16. database.Close()
  17. return nil, nil, E.New("incorrect database type, expected sing-geoip, got ", database.Metadata.DatabaseType)
  18. }
  19. return &Reader{database}, database.Metadata.Languages, nil
  20. }
  21. func (r *Reader) Lookup(addr netip.Addr) string {
  22. var code string
  23. _ = r.reader.Lookup(addr.AsSlice(), &code)
  24. if code != "" {
  25. return code
  26. }
  27. return "unknown"
  28. }
  29. func (r *Reader) Close() error {
  30. return r.reader.Close()
  31. }