1+ use anchor_client:: Cluster ;
12use anchor_syn:: idl:: Idl ;
23use anyhow:: { anyhow, Error , Result } ;
34use serde:: { Deserialize , Serialize } ;
4- use serum_common :: client :: Cluster ;
5+ use solana_sdk :: pubkey :: Pubkey ;
56use solana_sdk:: signature:: Keypair ;
7+ use std:: collections:: BTreeMap ;
68use std:: fs:: { self , File } ;
79use std:: io:: prelude:: * ;
810use std:: path:: Path ;
@@ -12,6 +14,7 @@ use std::str::FromStr;
1214#[ derive( Debug , Default ) ]
1315pub struct Config {
1416 pub cluster : Cluster ,
17+ pub clusters : Clusters ,
1518 pub wallet : WalletPath ,
1619 pub test : Option < Test > ,
1720}
@@ -73,14 +76,24 @@ struct _Config {
7376 cluster : String ,
7477 wallet : String ,
7578 test : Option < Test > ,
79+ clusters : Option < BTreeMap < String , BTreeMap < String , String > > > ,
7680}
7781
7882impl ToString for Config {
7983 fn to_string ( & self ) -> String {
84+ let clusters = {
85+ let c = ser_clusters ( & self . clusters ) ;
86+ if c. len ( ) == 0 {
87+ None
88+ } else {
89+ Some ( c)
90+ }
91+ } ;
8092 let cfg = _Config {
8193 cluster : format ! ( "{}" , self . cluster) ,
8294 wallet : self . wallet . to_string ( ) ,
8395 test : self . test . clone ( ) ,
96+ clusters,
8497 } ;
8598
8699 toml:: to_string ( & cfg) . expect ( "Must be well formed" )
@@ -97,10 +110,53 @@ impl FromStr for Config {
97110 cluster : cfg. cluster . parse ( ) ?,
98111 wallet : shellexpand:: tilde ( & cfg. wallet ) . parse ( ) ?,
99112 test : cfg. test ,
113+ clusters : cfg
114+ . clusters
115+ . map_or ( Ok ( BTreeMap :: new ( ) ) , |c| deser_clusters ( c) ) ?,
100116 } )
101117 }
102118}
103119
120+ fn ser_clusters (
121+ clusters : & BTreeMap < Cluster , BTreeMap < String , ProgramDeployment > > ,
122+ ) -> BTreeMap < String , BTreeMap < String , String > > {
123+ clusters
124+ . iter ( )
125+ . map ( |( cluster, programs) | {
126+ let cluster = cluster. to_string ( ) ;
127+ let programs = programs
128+ . iter ( )
129+ . map ( |( name, deployment) | ( name. clone ( ) , deployment. program_id . to_string ( ) ) )
130+ . collect :: < BTreeMap < String , String > > ( ) ;
131+ ( cluster, programs)
132+ } )
133+ . collect :: < BTreeMap < String , BTreeMap < String , String > > > ( )
134+ }
135+
136+ fn deser_clusters (
137+ clusters : BTreeMap < String , BTreeMap < String , String > > ,
138+ ) -> Result < BTreeMap < Cluster , BTreeMap < String , ProgramDeployment > > > {
139+ clusters
140+ . iter ( )
141+ . map ( |( cluster, programs) | {
142+ let cluster: Cluster = cluster. parse ( ) ?;
143+ let programs = programs
144+ . iter ( )
145+ . map ( |( name, program_id) | {
146+ Ok ( (
147+ name. clone ( ) ,
148+ ProgramDeployment {
149+ name : name. clone ( ) ,
150+ program_id : program_id. parse ( ) ?,
151+ } ,
152+ ) )
153+ } )
154+ . collect :: < Result < BTreeMap < String , ProgramDeployment > > > ( ) ?;
155+ Ok ( ( cluster, programs) )
156+ } )
157+ . collect :: < Result < BTreeMap < Cluster , BTreeMap < String , ProgramDeployment > > > > ( )
158+ }
159+
104160#[ derive( Debug , Clone , Serialize , Deserialize ) ]
105161pub struct Test {
106162 pub genesis : Vec < GenesisEntry > ,
@@ -177,4 +233,18 @@ impl Program {
177233 }
178234}
179235
236+ pub type Clusters = BTreeMap < Cluster , BTreeMap < String , ProgramDeployment > > ;
237+
238+ #[ derive( Debug , Default ) ]
239+ pub struct ProgramDeployment {
240+ pub name : String ,
241+ pub program_id : Pubkey ,
242+ }
243+
244+ pub struct ProgramWorkspace {
245+ pub name : String ,
246+ pub program_id : Pubkey ,
247+ pub idl : Idl ,
248+ }
249+
180250serum_common:: home_path!( WalletPath , ".config/solana/id.json" ) ;
0 commit comments