gen.go raw

   1  package filter
   2  
   3  import (
   4  	"math"
   5  
   6  	"next.orly.dev/pkg/nostr/crypto/ec/schnorr"
   7  	"next.orly.dev/pkg/nostr/crypto/ec/secp256k1"
   8  	"next.orly.dev/pkg/nostr/encoders/hex"
   9  	"next.orly.dev/pkg/nostr/encoders/kind"
  10  	"next.orly.dev/pkg/nostr/encoders/tag"
  11  	"next.orly.dev/pkg/nostr/encoders/timestamp"
  12  	"next.orly.dev/pkg/nostr/utils/values"
  13  	"github.com/minio/sha256-simd"
  14  	"next.orly.dev/pkg/lol/chk"
  15  	"lukechampine.com/frand"
  16  )
  17  
  18  // GenFilter is a testing tool to create random arbitrary filters for tests.
  19  func GenFilter() (f *F, err error) {
  20  	f = New()
  21  	n := frand.Intn(16)
  22  	for _ = range n {
  23  		id := make([]byte, sha256.Size)
  24  		frand.Read(id)
  25  		f.Ids.T = append(f.Ids.T, id)
  26  		// f.Ids.Field = append(f.Ids.Field, id)
  27  	}
  28  	n = frand.Intn(16)
  29  	for _ = range n {
  30  		f.Kinds.K = append(f.Kinds.K, kind.New(frand.Intn(math.MaxUint16)))
  31  	}
  32  	n = frand.Intn(16)
  33  	for _ = range n {
  34  		var sk *secp256k1.SecretKey
  35  		if sk, err = secp256k1.GenerateSecretKey(); chk.E(err) {
  36  			return
  37  		}
  38  		pk := sk.PubKey()
  39  		f.Authors.T = append(f.Authors.T, schnorr.SerializePubKey(pk))
  40  		// f.Authors.Field = append(f.Authors.Field, schnorr.SerializePubKey(pk))
  41  	}
  42  	a := frand.Intn(16)
  43  	if a < n {
  44  		n = a
  45  	}
  46  	for i := range n {
  47  		p := make([]byte, 0, schnorr.PubKeyBytesLen*2)
  48  		p = hex.EncAppend(p, f.Authors.T[i])
  49  	}
  50  	for b := 'a'; b <= 'z'; b++ {
  51  		l := frand.Intn(6)
  52  		var idb [][]byte
  53  		for range l {
  54  			bb := make([]byte, frand.Intn(31)+1)
  55  			frand.Read(bb)
  56  			id := make([]byte, 0, len(bb)*2)
  57  			id = hex.EncAppend(id, bb)
  58  			idb = append(idb, id)
  59  		}
  60  		idb = append([][]byte{{'#', byte(b)}}, idb...)
  61  		*f.Tags = append(*f.Tags, tag.NewFromBytesSlice(idb...))
  62  		// f.Tags.F = append(f.Tags.F, tag.FromBytesSlice(idb...))
  63  	}
  64  	tn := int(timestamp.Now().I64())
  65  	f.Since = &timestamp.T{int64(tn - frand.Intn(10000))}
  66  	f.Until = timestamp.Now()
  67  	if frand.Intn(10) > 5 {
  68  		f.Limit = values.ToUintPointer(uint(frand.Intn(1000)))
  69  	}
  70  	f.Search = []byte("token search text")
  71  	return
  72  }
  73  
  74  func GenFilters() (s S, err error) {
  75  	n := frand.Intn(5) + 1
  76  	for _ = range n {
  77  		var f *F
  78  		if f, err = GenFilter(); chk.E(err) {
  79  		}
  80  		s = append(s, f)
  81  	}
  82  	return
  83  }
  84