utils.go raw

   1  package nostr
   2  
   3  import (
   4  	"cmp"
   5  	"encoding/hex"
   6  	"net/url"
   7  	"strings"
   8  )
   9  
  10  // IsValidRelayURL checks if a URL is a valid relay URL (ws:// or wss://).
  11  func IsValidRelayURL(u string) bool {
  12  	parsed, err := url.Parse(u)
  13  	if err != nil {
  14  		return false
  15  	}
  16  	if parsed.Scheme != "wss" && parsed.Scheme != "ws" {
  17  		return false
  18  	}
  19  	return true
  20  }
  21  
  22  // IsValid32ByteHex checks if a string is a valid 32-byte hex string.
  23  func IsValid32ByteHex(thing string) bool {
  24  	if !isLowerHex(thing) {
  25  		return false
  26  	}
  27  	if len(thing) != 64 {
  28  		return false
  29  	}
  30  	_, err := hex.DecodeString(thing)
  31  	return err == nil
  32  }
  33  
  34  // CompareEvent is meant to to be used with slices.Sort
  35  func CompareEvent(a, b Event) int {
  36  	if a.CreatedAt == b.CreatedAt {
  37  		return strings.Compare(a.ID, b.ID)
  38  	}
  39  	return cmp.Compare(a.CreatedAt, b.CreatedAt)
  40  }
  41  
  42  // CompareEventReverse is meant to to be used with slices.Sort
  43  func CompareEventReverse(b, a Event) int {
  44  	if a.CreatedAt == b.CreatedAt {
  45  		return strings.Compare(a.ID, b.ID)
  46  	}
  47  	return cmp.Compare(a.CreatedAt, b.CreatedAt)
  48  }
  49  
  50  // CompareEventPtr is meant to to be used with slices.Sort
  51  func CompareEventPtr(a, b *Event) int {
  52  	if a == nil {
  53  		if b == nil {
  54  			return 0
  55  		} else {
  56  			return -1
  57  		}
  58  	} else if b == nil {
  59  		return 1
  60  	}
  61  
  62  	if a.CreatedAt == b.CreatedAt {
  63  		return strings.Compare(a.ID, b.ID)
  64  	}
  65  	return cmp.Compare(a.CreatedAt, b.CreatedAt)
  66  }
  67  
  68  // CompareEventPtrReverse is meant to to be used with slices.Sort
  69  func CompareEventPtrReverse(b, a *Event) int {
  70  	if a == nil {
  71  		if b == nil {
  72  			return 0
  73  		} else {
  74  			return -1
  75  		}
  76  	} else if b == nil {
  77  		return 1
  78  	}
  79  
  80  	if a.CreatedAt == b.CreatedAt {
  81  		return strings.Compare(a.ID, b.ID)
  82  	}
  83  	return cmp.Compare(a.CreatedAt, b.CreatedAt)
  84  }
  85