(config: Config, args: &ArgMatches)
| 64 | } |
| 65 | |
| 66 | pub async fn exec(config: Config, args: &ArgMatches) -> Result<(), Error> { |
| 67 | eprintln!("{UNSTABLE_WARNING}\n"); |
| 68 | let server = args.get_one::<String>("server").map(|s| s.as_ref()); |
| 69 | let force = args.get_flag("force"); |
| 70 | let anon_identity = args.get_flag("anon_identity"); |
| 71 | let no_config = args.get_flag("no_config"); |
| 72 | |
| 73 | let raw_parts: Vec<String> = args |
| 74 | .get_many::<String>("call_parts") |
| 75 | .map(|vals| vals.cloned().collect()) |
| 76 | .unwrap_or_default(); |
| 77 | |
| 78 | let config_targets = load_config_db_targets(no_config)?; |
| 79 | let resolved = resolve_optional_database_parts( |
| 80 | &raw_parts, |
| 81 | config_targets.as_deref(), |
| 82 | "function_name", |
| 83 | "spacetime call [database] <function_name> <arguments>... (or --no-config for legacy behavior)", |
| 84 | )?; |
| 85 | let reducer_procedure_name = resolved |
| 86 | .remaining_args |
| 87 | .first() |
| 88 | .ok_or_else(|| anyhow::anyhow!("internal error: function_name should be present after argument resolution"))?; |
| 89 | let call_arguments = resolved.remaining_args.iter().skip(1); |
| 90 | let resolved_server = server.or(resolved.server.as_deref()); |
| 91 | |
| 92 | let mut config = config; |
| 93 | let conn = crate::api::Connection { |
| 94 | host: config.get_host_url(resolved_server)?, |
| 95 | auth_header: get_auth_header(&mut config, anon_identity, resolved_server, !force).await?, |
| 96 | database_identity: database_identity(&config, &resolved.database, resolved_server).await?, |
| 97 | database: resolved.database.clone(), |
| 98 | }; |
| 99 | let api = ClientApi::new(conn); |
| 100 | |
| 101 | let database_identity = api.con.database_identity; |
| 102 | let database = &api.con.database; |
| 103 | |
| 104 | let module_def: ModuleDef = api.module_def().await?.try_into()?; |
| 105 | |
| 106 | let call_def = match module_def.reducer(&**reducer_procedure_name) { |
| 107 | Some(reducer_def) => CallDef::Reducer(reducer_def), |
| 108 | None => match module_def.procedure(&**reducer_procedure_name) { |
| 109 | Some(procedure_def) => CallDef::Procedure(procedure_def), |
| 110 | None => { |
| 111 | return Err(anyhow::Error::msg(no_such_reducer_or_procedure( |
| 112 | &database_identity, |
| 113 | database, |
| 114 | reducer_procedure_name, |
| 115 | &module_def, |
| 116 | ))); |
| 117 | } |
| 118 | }, |
| 119 | }; |
| 120 | |
| 121 | // String quote any arguments that should be quoted |
| 122 | let arguments = call_arguments |
| 123 | .zip(&call_def.params().elements) |
nothing calls this directly
no test coverage detected
searching dependent graphs…