1- use anyhow:: { Context as _, anyhow , bail} ;
1+ use anyhow:: { Context as _, bail} ;
22use clap:: Args ;
33use icp:: {
44 identity:: manifest:: IdentityList ,
55 network:: { Configuration , run_network} ,
6- project:: DEFAULT_LOCAL_NETWORK_NAME ,
76} ;
87use tracing:: debug;
98
9+ use super :: args:: NetworkOrEnvironmentArgs ;
1010use icp:: context:: Context ;
1111
1212/// Run a given network
1313#[ derive( Args , Debug ) ]
14+ #[ command( after_long_help = "\
15+ Examples:
16+
17+ # Use default 'local' network
18+ icp network start
19+
20+ # Use explicit network name
21+ icp network start mynetwork
22+
23+ # Use environment flag
24+ icp network start -e staging
25+
26+ # Use ICP_ENVIRONMENT variable
27+ ICP_ENVIRONMENT=staging icp network start
28+
29+ # Name overrides ICP_ENVIRONMENT
30+ ICP_ENVIRONMENT=staging icp network start local
31+
32+ # Background mode with environment
33+ icp network start -e staging -d
34+ " ) ]
1435pub ( crate ) struct StartArgs {
15- /// Name of the network to start
16- #[ arg( default_value = DEFAULT_LOCAL_NETWORK_NAME ) ]
17- name : String ,
36+ #[ clap( flatten) ]
37+ network_selection : NetworkOrEnvironmentArgs ,
1838
1939 /// Starts the network in a background process. This command will exit once the network is running.
2040 /// To stop the network, use 'icp network stop'.
@@ -26,36 +46,34 @@ pub(crate) async fn exec(ctx: &Context, args: &StartArgs) -> Result<(), anyhow::
2646 // Load project
2747 let p = ctx. project . load ( ) . await ?;
2848
29- // Obtain network configuration
30- let network = p
31- . networks
32- . get ( & args. name )
33- . ok_or_else ( || anyhow ! ( "project does not contain a network named '{}'" , args. name) ) ?;
49+ // Convert args to selection and get network
50+ let selection: Result < _ , _ > = args. network_selection . clone ( ) . into ( ) ;
51+ let network = ctx. get_network_or_environment ( & selection?) . await ?;
3452
3553 let cfg = match & network. configuration {
3654 // Locally-managed network
3755 Configuration :: Managed { managed : cfg } => cfg,
3856
3957 // Non-managed networks cannot be started
4058 Configuration :: Connected { connected : _ } => {
41- bail ! ( "network '{}' is not a managed network" , args . name)
59+ bail ! ( "network '{}' is not a managed network" , network . name)
4260 }
4361 } ;
4462
4563 let pdir = & p. dir ;
4664
4765 // Network directory
48- let nd = ctx. network . get_network_directory ( network) ?;
66+ let nd = ctx. network . get_network_directory ( & network) ?;
4967 nd. ensure_exists ( )
5068 . context ( "failed to create network directory" ) ?;
5169
5270 if nd. load_network_descriptor ( ) . await ?. is_some ( ) {
53- bail ! ( "network '{}' is already running" , args . name) ;
71+ bail ! ( "network '{}' is already running" , network . name) ;
5472 }
5573
5674 // Clean up any existing canister ID mappings of which environment is on this network
5775 for env in p. environments . values ( ) {
58- if env. network == * network {
76+ if env. network == network {
5977 // It's been ensured that the network is managed, so is_cache is true.
6078 ctx. ids . cleanup ( true , env. name . as_str ( ) ) ?;
6179 }
0 commit comments