-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathoptions.go
130 lines (118 loc) · 2.84 KB
/
options.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package herald
import (
"crypto/rand"
"errors"
"github.com/ipfs/go-datastore"
"github.com/ipfs/go-datastore/sync"
"github.com/ipni/go-libipni/metadata"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/multiformats/go-multiaddr"
)
type (
Option func(*options) error
options struct {
httpPublisherListenAddr string
topic string
id peer.ID
identity crypto.PrivKey
providerAddrs []string
localPublisherDir string
adEntriesChunkSize int
ds datastore.Datastore
metadata []byte
}
)
func newOptions(o ...Option) (*options, error) {
opts := options{
httpPublisherListenAddr: "0.0.0.0:40080",
topic: "/indexer/ingest/mainnet",
providerAddrs: nil,
adEntriesChunkSize: 16 << 10,
}
for _, apply := range o {
if err := apply(&opts); err != nil {
return nil, err
}
}
if opts.metadata == nil {
return nil, errors.New("metadata must be set")
}
if opts.providerAddrs == nil {
return nil, errors.New("at least one provider address must be set")
}
if opts.identity == nil {
logger.Warnw("no identity is specified; generating one at random...")
var err error
opts.identity, _, err = crypto.GenerateEd25519Key(rand.Reader)
if err != nil {
return nil, err
}
opts.id, err = peer.IDFromPrivateKey(opts.identity)
if err != nil {
return nil, err
}
logger.Infow("using randomly generated identity", "peerID", opts.id)
}
if opts.ds == nil {
logger.Warnw("using in-memory datastore")
opts.ds = sync.MutexWrap(datastore.NewMapDatastore())
}
return &opts, nil
}
func WithHttpPublisherListenAddr(v string) Option {
return func(o *options) error {
o.httpPublisherListenAddr = v
return nil
}
}
func WithTopic(v string) Option {
return func(o *options) error {
o.topic = v
return nil
}
}
func WithIdentity(v crypto.PrivKey) Option {
return func(o *options) error {
var err error
if o.id, err = peer.IDFromPrivateKey(v); err != nil {
return err
}
o.identity = v
return nil
}
}
func WithProviderAddress(a ...multiaddr.Multiaddr) Option {
return func(o *options) error {
o.providerAddrs = make([]string, 0, len(a))
for _, ma := range a {
o.providerAddrs = append(o.providerAddrs, ma.String())
}
return nil
}
}
func WithLocalPublisherDir(v string) Option {
return func(o *options) error {
o.localPublisherDir = v
return nil
}
}
func WithAdEntriesChunkSize(v int) Option {
return func(o *options) error {
o.adEntriesChunkSize = v
return nil
}
}
func WithDatastore(v datastore.Datastore) Option {
return func(o *options) error {
o.ds = v
return nil
}
}
func WithMetadata(v metadata.Metadata) Option {
return func(o *options) error {
var err error
o.metadata, err = v.MarshalBinary()
return err
}
}