github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/blindtree/values.go (about) 1 package blindtree 2 3 import ( 4 "github.com/keybase/client/go/protocol/keybase1" 5 "github.com/keybase/client/go/sig3" 6 "github.com/keybase/go-codec/codec" 7 ) 8 9 // BlindMerkleValue simulates a union type to store values of different types in 10 // the Blind Merkle Tree. To add a new type, grab a new BlindMerkleValueType 11 // constant and update the CodecEncodeSelf and CodecDecodeSelf functions as 12 // appropriate. 13 type BlindMerkleValue struct { 14 ValueType BlindMerkleValueType 15 InnerValue interface{} 16 } 17 18 // Note: values up to 127 are preferred as they are encoded in a single byte 19 type BlindMerkleValueType uint8 20 21 const ( 22 ValueTypeEmpty BlindMerkleValueType = 0 23 ValueTypeTeamV1 BlindMerkleValueType = 1 24 25 ValueTypeStringForTesting BlindMerkleValueType = 127 26 ) 27 28 var _ codec.Selfer = &BlindMerkleValue{} 29 30 func (t *BlindMerkleValue) CodecEncodeSelf(e *codec.Encoder) { 31 switch t.ValueType { 32 case ValueTypeTeamV1, ValueTypeStringForTesting, ValueTypeEmpty: 33 // pass 34 default: 35 panic("Unknown merkle value type") 36 } 37 e.MustEncode(t.ValueType) 38 e.MustEncode(t.InnerValue) 39 } 40 41 func (t *BlindMerkleValue) CodecDecodeSelf(d *codec.Decoder) { 42 d.MustDecode(&t.ValueType) 43 switch t.ValueType { 44 case ValueTypeEmpty: 45 // Nothing to do here 46 case ValueTypeTeamV1: 47 var v TeamV1Value 48 d.MustDecode(&v) 49 t.InnerValue = v 50 case ValueTypeStringForTesting: 51 var s string 52 d.MustDecode(&s) 53 t.InnerValue = s 54 default: 55 panic("Unrecognized Value Type") 56 } 57 } 58 59 type TeamV1Value struct { 60 _struct struct{} `codec:",toarray"` //nolint 61 Tails map[keybase1.SeqType]sig3.Tail 62 } 63 64 func BlindMerkleValueStringForTesting(s string) BlindMerkleValue { 65 return BlindMerkleValue{ValueType: ValueTypeStringForTesting, InnerValue: s} 66 } 67 68 func BlindMerkleValueTeamV1(v TeamV1Value) BlindMerkleValue { 69 return BlindMerkleValue{ValueType: ValueTypeTeamV1, InnerValue: v} 70 } 71 72 func BlindMerkleValueEmpty() BlindMerkleValue { 73 return BlindMerkleValue{ValueType: ValueTypeEmpty, InnerValue: nil} 74 }