11package cardanocli
22
33import (
4- "bytes "
4+ "context "
55 "encoding/hex"
66 "encoding/json"
77 "errors"
@@ -12,11 +12,44 @@ import (
1212 "strconv"
1313 "strings"
1414
15+ flag "github.com/spf13/pflag"
16+
1517 "github.com/echovl/cardano-go"
1618)
1719
20+ var socketPath , fallbackSocketPath string
21+
22+ func AddFlags (fs * flag.FlagSet ) {
23+ fs .StringVar (& socketPath , "cardano-node-socket-path" , "" , "" )
24+ fs .StringVar (& fallbackSocketPath , "fallback-cardano-node-socket-path" , "" , "" )
25+ }
26+
27+ func availableAsSocket (fn string ) bool {
28+ fi , err := os .Stat (fn )
29+ if err != nil {
30+ return false
31+ }
32+ if (fi .Mode ().Type () & os .ModeSocket ) != os .ModeSocket {
33+ return false
34+ }
35+ return true
36+ }
37+
38+ func getSocketPathToUse () string {
39+ sp := socketPath
40+ if sp != "" && availableAsSocket (sp ) {
41+ return sp
42+ }
43+ sp = fallbackSocketPath
44+ if sp != "" && availableAsSocket (sp ) {
45+ return sp
46+ }
47+ return os .Getenv ("CARDANO_NODE_SOCKET_PATH" )
48+ }
49+
1850// CardanoCli implements Node using cardano-cli and a local node.
1951type CardanoCli struct {
52+ ctx context.Context
2053 network cardano.Network
2154}
2255
@@ -35,27 +68,39 @@ type cliTx struct {
3568}
3669
3770// NewNode returns a new instance of CardanoCli.
38- func NewNode (network cardano.Network ) cardano.Node {
71+ func NewNode (network cardano.Network , rest ... any ) cardano.Node {
72+ if len (rest ) > 0 {
73+ return & CardanoCli {network : network , ctx : rest [0 ].(context.Context )}
74+ }
3975 return & CardanoCli {network : network }
4076}
4177
42- func (c * CardanoCli ) runCommand (args ... string ) ([] byte , error ) {
43- out := & bytes. Buffer {}
78+ func (c * CardanoCli ) runCommand (args ... string ) (string , error ) {
79+ out := & strings. Builder {}
4480
4581 if c .network == cardano .Mainnet {
4682 args = append (args , "--mainnet" )
4783 } else {
4884 args = append (args , "--testnet-magic" , strconv .Itoa (cardano .ProtocolMagic ))
4985 }
5086
51- cmd := exec .Command ("cardano-cli" , args ... )
87+ var cmd * exec.Cmd
88+ if c .ctx == nil {
89+ cmd = exec .Command ("cardano-cli" , args ... )
90+ } else {
91+ cmd = exec .CommandContext (c .ctx , "cardano-cli" , args ... )
92+ }
5293 cmd .Stdout = out
5394 cmd .Stderr = os .Stderr
5495 if err := cmd .Run (); err != nil {
55- return nil , err
96+ return "" , err
5697 }
5798
58- return out .Bytes (), nil
99+ return out .String (), nil
100+ }
101+
102+ func (c * CardanoCli ) DoCommand (args ... string ) (string , error ) {
103+ return c .runCommand (args ... )
59104}
60105
61106func (c * CardanoCli ) UTxOs (addr cardano.Address ) ([]cardano.UTxO , error ) {
@@ -65,7 +110,7 @@ func (c *CardanoCli) UTxOs(addr cardano.Address) ([]cardano.UTxO, error) {
65110 }
66111
67112 utxos := []cardano.UTxO {}
68- lines := strings .Split (string ( out ) , "\n " )
113+ lines := strings .Split (out , "\n " )
69114
70115 if len (lines ) < 3 {
71116 return utxos , nil
@@ -142,7 +187,7 @@ func (c *CardanoCli) Tip() (*cardano.NodeTip, error) {
142187 }
143188
144189 cliTip := & tip {}
145- if err = json .Unmarshal (out , cliTip ); err != nil {
190+ if err = json .Unmarshal ([] byte ( out ) , cliTip ); err != nil {
146191 return nil , err
147192 }
148193
@@ -171,7 +216,7 @@ func (c *CardanoCli) SubmitTx(tx *cardano.Tx) (*cardano.Hash32, error) {
171216
172217 out , err := c .runCommand ("transaction" , "submit" , "--tx-file" , txFile .Name ())
173218 if err != nil {
174- return nil , errors .New (string ( out ) )
219+ return nil , errors .New (out )
175220 }
176221
177222 txHash , err := tx .Hash ()
@@ -191,11 +236,11 @@ type protocolParameters struct {
191236func (c * CardanoCli ) ProtocolParams () (* cardano.ProtocolParams , error ) {
192237 out , err := c .runCommand ("query" , "protocol-parameters" )
193238 if err != nil {
194- return nil , errors .New (string ( out ) )
239+ return nil , errors .New (out )
195240 }
196241
197242 var cparams protocolParameters
198- if err := json .Unmarshal (out , & cparams ); err != nil {
243+ if err := json .Unmarshal ([] byte ( out ) , & cparams ); err != nil {
199244 return nil , err
200245 }
201246
0 commit comments