@@ -2,17 +2,12 @@ use serde::{Deserialize, Serialize};
22use std:: collections:: HashMap ;
33
44use clap:: Parser ;
5- use miette:: { bail, Context , IntoDiagnostic } ;
5+ use miette:: { bail, IntoDiagnostic } ;
66use tracing:: instrument;
77
88use crate :: { output:: OutputFormatter , utils:: Name } ;
99
10- use super :: { types:: Provider , utxorpc:: UTxORPCProvider } ;
11-
12- #[ derive( clap:: ValueEnum , Clone ) ]
13- enum ProviderKind {
14- Utxorpc ,
15- }
10+ use super :: types:: Provider ;
1611
1712#[ derive( clap:: ValueEnum , Clone , PartialEq ) ]
1813enum NetworkKind {
@@ -32,10 +27,6 @@ pub struct Args {
3227 #[ arg( long) ]
3328 name : Option < String > ,
3429
35- /// Provider kind.
36- #[ arg( long) ]
37- kind : Option < ProviderKind > ,
38-
3930 /// Whether to set as default provider.
4031 #[ arg( long) ]
4132 is_default : Option < bool > ,
@@ -44,9 +35,21 @@ pub struct Args {
4435 #[ arg( long) ]
4536 network_kind : Option < NetworkKind > ,
4637
47- /// JSON encoded parameters particular to the provider type.
38+ // UTxORPC url
39+ #[ arg( long) ]
40+ utxorpc_url : Option < String > ,
41+
42+ /// JSON encoded UTxORPC headers
43+ #[ arg( long) ]
44+ utxorpc_headers : Option < String > ,
45+
46+ // TRP url
47+ #[ arg( long) ]
48+ trp_url : Option < String > ,
49+
50+ /// JSON encoded TRP headers
4851 #[ arg( long) ]
49- parameters : Option < String > ,
52+ trp_headers : Option < String > ,
5053}
5154
5255#[ instrument( "create" , skip_all) ]
@@ -71,17 +74,6 @@ pub async fn run(args: Args, ctx: &mut crate::Context) -> miette::Result<()> {
7174 )
7275 }
7376
74- let kind = match args. kind {
75- Some ( kind) => kind,
76- None => match inquire:: Select :: new ( "Kind of provider:" , vec ! [ "UTxORPC" ] )
77- . prompt ( )
78- . into_diagnostic ( ) ?
79- {
80- "UTxORPC" => ProviderKind :: Utxorpc ,
81- _ => bail ! ( "Invalid kind." ) ,
82- } ,
83- } ;
84-
8577 let newtork_kind = match args. network_kind {
8678 Some ( network_kind) => network_kind,
8779 None => match inquire:: Select :: new ( "Network kind:" , vec ! [ "mainnet" , "testnet" ] )
@@ -95,55 +87,88 @@ pub async fn run(args: Args, ctx: &mut crate::Context) -> miette::Result<()> {
9587 } ;
9688 let is_testnet = newtork_kind == NetworkKind :: Testnet ;
9789
98- // Provider specific inquires.
99- let provider = match kind {
100- ProviderKind :: Utxorpc => {
101- let ( url, headers) = match args. parameters {
102- Some ( parameters) => {
103- let parameters: UTxORPCParameters = serde_json:: from_str ( & parameters)
104- . into_diagnostic ( )
105- . context ( "Invalid parameters" ) ?;
106- ( parameters. url , parameters. headers )
107- }
108- None => {
109- let url = inquire:: Text :: new ( "URL:" ) . prompt ( ) . into_diagnostic ( ) ?;
110- let headers: HashMap < String , String > = inquire:: Text :: new (
111- "Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'" ,
112- )
113- . prompt ( )
114- . into_diagnostic ( ) ?
115- . split ( "," )
116- . flat_map ( |keyval| {
117- if keyval. is_empty ( ) {
118- return None
119- }
120- let mut parts = keyval. split ( ":" ) ;
121- let key = match parts. next ( ) {
122- Some ( s) => s,
123- None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
124- } ;
125- let val = match parts. next ( ) {
126- Some ( s) => s,
127- None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
128- } ;
129- Some ( Ok ( ( key. to_string ( ) , val. to_string ( ) ) ) )
130- } )
131- . collect :: < Result < _ , miette:: Error > > ( ) ?;
132- ( url, headers)
133- }
90+ let url = match args. utxorpc_url {
91+ Some ( url) => url,
92+ None => inquire:: Text :: new ( "URL:" ) . prompt ( ) . into_diagnostic ( ) ?,
93+ } ;
94+ let headers: HashMap < String , String > = inquire:: Text :: new (
95+ "Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'" ,
96+ )
97+ . prompt ( )
98+ . into_diagnostic ( ) ?
99+ . split ( "," )
100+ . flat_map ( |keyval| {
101+ if keyval. is_empty ( ) {
102+ return None ;
103+ }
104+ let mut parts = keyval. split ( ":" ) ;
105+ let key = match parts. next ( ) {
106+ Some ( s) => s,
107+ None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
108+ } ;
109+ let val = match parts. next ( ) {
110+ Some ( s) => s,
111+ None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
112+ } ;
113+ Some ( Ok ( ( key. to_string ( ) , val. to_string ( ) ) ) )
114+ } )
115+ . collect :: < Result < _ , miette:: Error > > ( ) ?;
116+
117+ let trp_url = match args. trp_url {
118+ Some ( url) => Some ( url) ,
119+ None => {
120+ let response = inquire:: Text :: new ( "TRP URL (leave empty for undefined):" )
121+ . prompt ( )
122+ . into_diagnostic ( ) ?;
123+ if response. is_empty ( ) {
124+ None
125+ } else {
126+ Some ( response)
127+ }
128+ }
129+ } ;
130+ let mut trp_headers = None ;
131+ if trp_url. is_some ( ) {
132+ let aux: HashMap < String , String > = inquire:: Text :: new (
133+ "Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'" ,
134+ )
135+ . prompt ( )
136+ . into_diagnostic ( ) ?
137+ . split ( "," )
138+ . flat_map ( |keyval| {
139+ if keyval. is_empty ( ) {
140+ return None ;
141+ }
142+ let mut parts = keyval. split ( ":" ) ;
143+ let key = match parts. next ( ) {
144+ Some ( s) => s,
145+ None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
134146 } ;
135- Provider :: UTxORPC ( UTxORPCProvider {
136- name,
137- is_default : Some ( ctx. store . providers ( ) . is_empty ( ) ) ,
138- is_testnet : Some ( is_testnet) ,
139- url,
140- headers : if headers. is_empty ( ) {
141- None
142- } else {
143- Some ( headers)
144- } ,
145- } )
147+ let val = match parts. next ( ) {
148+ Some ( s) => s,
149+ None => return Some ( Err ( miette:: Error :: msg ( "Invalid header" ) ) ) ,
150+ } ;
151+ Some ( Ok ( ( key. to_string ( ) , val. to_string ( ) ) ) )
152+ } )
153+ . collect :: < Result < _ , miette:: Error > > ( ) ?;
154+
155+ if !aux. is_empty ( ) {
156+ trp_headers = Some ( aux) ;
146157 }
158+ }
159+
160+ let provider = Provider {
161+ name,
162+ is_default : Some ( ctx. store . providers ( ) . is_empty ( ) ) ,
163+ is_testnet : Some ( is_testnet) ,
164+ url,
165+ headers : if headers. is_empty ( ) {
166+ None
167+ } else {
168+ Some ( headers)
169+ } ,
170+ trp_url,
171+ trp_headers,
147172 } ;
148173
149174 ctx. store . add_provider ( & provider) ?;
0 commit comments