MCPcopy Create free account
hub / github.com/clockworklabs/SpacetimeDB / exec

Function exec

crates/cli/src/subcommands/call.rs:66–169  ·  view source on GitHub ↗
(config: Config, args: &ArgMatches)

Source from the content-addressed store, hash-verified

64}
65
66pub 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)

Callers

nothing calls this directly

Calls 15

load_config_db_targetsFunction · 0.85
get_auth_headerFunction · 0.85
database_identityFunction · 0.85
invalid_argumentsFunction · 0.85
skipMethod · 0.80
get_host_urlMethod · 0.80
try_intoMethod · 0.80
iterMethod · 0.65
callMethod · 0.65
newFunction · 0.50

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…