Skip to content

Commit 340667d

Browse files
committed
define ReducerName backed by EcoString
1 parent 67df4a4 commit 340667d

27 files changed

Lines changed: 170 additions & 93 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/client-api-messages/src/websocket.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use spacetimedb_sats::{
3131
ser::Serialize,
3232
AlgebraicType, SpacetimeType,
3333
};
34-
use spacetimedb_schema::table_name::TableName;
34+
use spacetimedb_schema::{reducer_name::ReducerName, table_name::TableName};
3535
use std::sync::Arc;
3636

3737
pub const TEXT_PROTOCOL: &str = "v1.json.spacetimedb";
@@ -152,7 +152,7 @@ impl<Args> ClientMessage<Args> {
152152
#[sats(crate = spacetimedb_lib)]
153153
pub struct CallReducer<Args> {
154154
/// The name of the reducer to call.
155-
pub reducer: Box<str>,
155+
pub reducer: ReducerName,
156156
/// The arguments to the reducer.
157157
///
158158
/// In the wire format, this will be a [`Bytes`], BSATN or JSON encoded according to the reducer's argument schema
@@ -589,7 +589,7 @@ pub struct ReducerCallInfo<F: WebsocketFormat> {
589589
/// We should consider not sending this at all and instead
590590
/// having a startup message where the name <-> id bindings
591591
/// are established between the host and the client.
592-
pub reducer_name: Box<str>,
592+
pub reducer_name: ReducerName,
593593
/// The numerical id of the reducer that was called.
594594
pub reducer_id: u32,
595595
/// The arguments to the reducer, encoded as BSATN or JSON according to the reducer's argument schema

crates/codegen/src/rust.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,8 @@ pub(super) fn parse_table_update(
343343
let reducer_name = reducer.name.deref();
344344
let func_name = reducer_function_name(reducer);
345345
let set_reducer_flags_trait = reducer_flags_trait_name(reducer);
346-
let args_type = function_args_type_name(&reducer.name);
347-
let enum_variant_name = reducer_variant_name(&reducer.name);
346+
let args_type = function_args_type_name(&reducer.name.into_identifier());
347+
let enum_variant_name = reducer_variant_name(&reducer.name.into_identifier());
348348

349349
// Define an "args struct" for the reducer.
350350
// This is not user-facing (note the `pub(super)` visibility);
@@ -366,7 +366,7 @@ pub(super) fn parse_table_update(
366366

367367
out.newline();
368368

369-
let callback_id = reducer_callback_id_name(&reducer.name);
369+
let callback_id = reducer_callback_id_name(&reducer.name.into_identifier());
370370

371371
let FormattedArglist {
372372
arglist_no_delimiters,
@@ -494,7 +494,7 @@ impl {set_reducer_flags_trait} for super::SetReducerFlags {{
494494
);
495495

496496
OutputFile {
497-
filename: reducer_module_name(&reducer.name) + ".rs",
497+
filename: reducer_module_name(&reducer.name.into_identifier()) + ".rs",
498498
code: output.into_inner(),
499499
}
500500
}
@@ -1129,7 +1129,7 @@ fn reducer_flags_trait_name(reducer: &ReducerDef) -> String {
11291129
fn iter_module_names(module: &ModuleDef) -> impl Iterator<Item = String> + '_ {
11301130
itertools::chain!(
11311131
iter_types(module).map(|ty| type_module_name(&ty.name)),
1132-
iter_reducers(module).map(|r| reducer_module_name(&r.name)),
1132+
iter_reducers(module).map(|r| reducer_module_name(&r.name.into_identifier())),
11331133
iter_tables(module).map(|tbl| table_module_name(&tbl.name)),
11341134
iter_views(module).map(|view| table_module_name(&view.name)),
11351135
iter_procedures(module).map(|proc| procedure_module_name(&proc.name)),
@@ -1160,10 +1160,10 @@ fn print_module_reexports(module: &ModuleDef, out: &mut Indenter) {
11601160
writeln!(out, "pub use {mod_name}::*;");
11611161
}
11621162
for reducer in iter_reducers(module) {
1163-
let mod_name = reducer_module_name(&reducer.name);
1163+
let mod_name = reducer_module_name(&reducer.name.into_identifier());
11641164
let reducer_trait_name = reducer_function_name(reducer);
11651165
let flags_trait_name = reducer_flags_trait_name(reducer);
1166-
let callback_id_name = reducer_callback_id_name(&reducer.name);
1166+
let callback_id_name = reducer_callback_id_name(&reducer.name.into_identifier());
11671167
writeln!(
11681168
out,
11691169
"pub use {mod_name}::{{{reducer_trait_name}, {flags_trait_name}, {callback_id_name}}};"
@@ -1193,7 +1193,7 @@ fn print_reducer_enum_defn(module: &ModuleDef, out: &mut Indenter) {
11931193
"pub enum Reducer {",
11941194
|out| {
11951195
for reducer in iter_reducers(module) {
1196-
write!(out, "{} ", reducer_variant_name(&reducer.name));
1196+
write!(out, "{} ", reducer_variant_name(&reducer.name.into_identifier()));
11971197
if !reducer.params_for_generate.elements.is_empty() {
11981198
// If the reducer has any arguments, generate a "struct variant,"
11991199
// like `Foo { bar: Baz, }`.
@@ -1226,7 +1226,11 @@ impl __sdk::InModule for Reducer {{
12261226
"match self {",
12271227
|out| {
12281228
for reducer in iter_reducers(module) {
1229-
write!(out, "Reducer::{}", reducer_variant_name(&reducer.name));
1229+
write!(
1230+
out,
1231+
"Reducer::{}",
1232+
reducer_variant_name(&reducer.name.into_identifier())
1233+
);
12301234
if !reducer.params_for_generate.elements.is_empty() {
12311235
// Because we're emitting unit variants when the payload is empty,
12321236
// we will emit different patterns for empty vs non-empty variants.
@@ -1282,8 +1286,8 @@ impl __sdk::InModule for Reducer {{
12821286
out,
12831287
"{:?} => Ok(__sdk::parse_reducer_args::<{}::{}>({:?}, &value.args)?.into()),",
12841288
reducer.name.deref(),
1285-
reducer_module_name(&reducer.name),
1286-
function_args_type_name(&reducer.name),
1289+
reducer_module_name(&reducer.name.into_identifier()),
1290+
function_args_type_name(&reducer.name.into_identifier()),
12871291
reducer.name.deref(),
12881292
);
12891293
}

crates/codegen/src/typescript.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ impl Lang for TypeScript {
157157
define_body_for_reducer(module, out, &reducer.params_for_generate.elements);
158158

159159
OutputFile {
160-
filename: reducer_module_name(&reducer.name) + ".ts",
160+
filename: reducer_module_name(&reducer.name.into_identifier()) + ".ts",
161161
code: output.into_inner(),
162162
}
163163
}
@@ -212,8 +212,8 @@ impl Lang for TypeScript {
212212
writeln!(out, "// Import and reexport all reducer arg types");
213213
for reducer in iter_reducers(module) {
214214
let reducer_name = &reducer.name;
215-
let reducer_module_name = reducer_module_name(reducer_name);
216-
let args_type = reducer_args_type_name(&reducer.name);
215+
let reducer_module_name = reducer_module_name(&reducer_name.into_identifier());
216+
let args_type = reducer_args_type_name(&reducer.name.into_identifier());
217217
writeln!(out, "import {args_type} from \"./{reducer_module_name}\";");
218218
writeln!(out, "export {{ {args_type} }};");
219219
}
@@ -290,7 +290,7 @@ impl Lang for TypeScript {
290290
continue;
291291
}
292292
let reducer_name = &reducer.name;
293-
let args_type = reducer_args_type_name(&reducer.name);
293+
let args_type = reducer_args_type_name(&reducer.name.into_identifier());
294294
writeln!(out, "__reducerSchema(\"{}\", {}),", reducer_name, args_type);
295295
}
296296
out.dedent(1);

crates/commitlog/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ async-stream = { workspace = true, optional = true }
2121
bitflags.workspace = true
2222
bytes= { workspace = true, optional = true }
2323
crc32c.workspace = true
24+
ecow.workspace = true
2425
futures = { workspace = true, optional = true }
2526
itertools.workspace = true
2627
log.workspace = true

crates/core/src/client/message_handlers.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use spacetimedb_datastore::execution_context::WorkloadType;
1111
use spacetimedb_lib::de::serde::DeserializeWrapper;
1212
use spacetimedb_lib::identity::RequestId;
1313
use spacetimedb_lib::{bsatn, ConnectionId, Timestamp};
14+
use spacetimedb_schema::reducer_name::ReducerName;
1415
use std::borrow::Cow;
1516
use std::sync::Arc;
1617
use std::time::{Duration, Instant};
@@ -163,7 +164,7 @@ pub async fn handle(client: &ClientConnection, message: DataMessage, timer: Inst
163164
#[derive(thiserror::Error, Debug)]
164165
#[error("error executing message (reducer: {reducer:?}) (err: {err:#})")]
165166
pub struct MessageExecutionError {
166-
pub reducer: Option<Box<str>>,
167+
pub reducer: Option<ReducerName>,
167168
pub reducer_id: Option<ReducerId>,
168169
pub caller_identity: Identity,
169170
pub caller_connection_id: Option<ConnectionId>,
@@ -178,7 +179,7 @@ impl MessageExecutionError {
178179
caller_identity: self.caller_identity,
179180
caller_connection_id: self.caller_connection_id,
180181
function_call: ModuleFunctionCall {
181-
reducer: self.reducer.unwrap_or_else(|| "<none>".into()).into(),
182+
reducer: self.reducer.unwrap_or_else(|| ReducerName::new_from_str("<none>")),
182183
reducer_id: self.reducer_id.unwrap_or(u32::MAX.into()),
183184
args: Default::default(),
184185
},

crates/core/src/client/messages.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ impl ToProtocol for TransactionUpdateMessage {
282282
status,
283283
caller_identity: event.caller_identity,
284284
reducer_call: ws::ReducerCallInfo {
285-
reducer_name: event.function_call.reducer.to_owned().into(),
285+
reducer_name: event.function_call.reducer.clone(),
286286
reducer_id: event.function_call.reducer_id.into(),
287287
args,
288288
request_id,

crates/core/src/db/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::Arc;
22

33
use enum_map::EnumMap;
4+
use spacetimedb_schema::reducer_name::ReducerName;
45
use tokio::sync::mpsc;
56

67
use crate::subscription::ExecutionCounters;
@@ -37,7 +38,7 @@ pub struct Config {
3738
/// We use a separate task to record metrics to avoid blocking transactions.
3839
pub struct MetricsMessage {
3940
/// The reducer the produced these metrics.
40-
reducer: String,
41+
reducer: ReducerName,
4142
/// Metrics from a mutable transaction.
4243
metrics_for_writer: Option<TxMetrics>,
4344
/// Metrics from a read-only transaction.
@@ -60,7 +61,7 @@ pub struct MetricsRecorderQueue {
6061
impl MetricsRecorderQueue {
6162
pub fn send_metrics(
6263
&self,
63-
reducer: String,
64+
reducer: ReducerName,
6465
metrics_for_writer: Option<TxMetrics>,
6566
metrics_for_reader: Option<TxMetrics>,
6667
tx_data: Option<Arc<TxData>>,

crates/core/src/db/relational_db.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use spacetimedb_sats::algebraic_type::fmt::fmt_algebraic_type;
4646
use spacetimedb_sats::memory_usage::MemoryUsage;
4747
use spacetimedb_sats::{AlgebraicType, AlgebraicValue, ProductType, ProductValue};
4848
use spacetimedb_schema::def::{ModuleDef, TableDef, ViewDef};
49+
use spacetimedb_schema::reducer_name::ReducerName;
4950
use spacetimedb_schema::schema::{
5051
ColumnSchema, IndexSchema, RowLevelSecuritySchema, Schema, SequenceSchema, TableSchema,
5152
};
@@ -769,7 +770,7 @@ impl RelationalDB {
769770
}
770771

771772
#[tracing::instrument(level = "trace", skip_all)]
772-
pub fn rollback_mut_tx(&self, tx: MutTx) -> (TxOffset, TxMetrics, String) {
773+
pub fn rollback_mut_tx(&self, tx: MutTx) -> (TxOffset, TxMetrics, ReducerName) {
773774
log::trace!("ROLLBACK MUT TX");
774775
self.inner.rollback_mut_tx(tx)
775776
}
@@ -781,14 +782,14 @@ impl RelationalDB {
781782
}
782783

783784
#[tracing::instrument(level = "trace", skip_all)]
784-
pub fn release_tx(&self, tx: Tx) -> (TxOffset, TxMetrics, String) {
785+
pub fn release_tx(&self, tx: Tx) -> (TxOffset, TxMetrics, ReducerName) {
785786
log::trace!("RELEASE TX");
786787
self.inner.release_tx(tx)
787788
}
788789

789790
#[tracing::instrument(level = "trace", skip_all)]
790791
#[allow(clippy::type_complexity)]
791-
pub fn commit_tx(&self, tx: MutTx) -> Result<Option<(TxOffset, Arc<TxData>, TxMetrics, String)>, DBError> {
792+
pub fn commit_tx(&self, tx: MutTx) -> Result<Option<(TxOffset, Arc<TxData>, TxMetrics, ReducerName)>, DBError> {
792793
log::trace!("COMMIT MUT TX");
793794

794795
let reducer_context = tx.ctx.reducer_context().cloned();
@@ -1002,7 +1003,7 @@ impl RelationalDB {
10021003
/// Should only be called after the tx lock has been fully released.
10031004
pub(crate) fn report_tx_metrics(
10041005
&self,
1005-
reducer: String,
1006+
reducer: ReducerName,
10061007
tx_data: Option<Arc<TxData>>,
10071008
metrics_for_writer: Option<TxMetrics>,
10081009
metrics_for_reader: Option<TxMetrics>,
@@ -1469,12 +1470,12 @@ impl RelationalDB {
14691470
}
14701471

14711472
/// Reports the metrics for `reducer`, using counters provided by `db`.
1472-
pub fn report_mut_tx_metrics(&self, reducer: String, metrics: TxMetrics, tx_data: Option<Arc<TxData>>) {
1473+
pub fn report_mut_tx_metrics(&self, reducer: ReducerName, metrics: TxMetrics, tx_data: Option<Arc<TxData>>) {
14731474
self.report_tx_metrics(reducer, tx_data, Some(metrics), None);
14741475
}
14751476

14761477
/// Reports subscription metrics for `reducer`, using counters provided by `db`.
1477-
pub fn report_read_tx_metrics(&self, reducer: String, metrics: TxMetrics) {
1478+
pub fn report_read_tx_metrics(&self, reducer: ReducerName, metrics: TxMetrics) {
14781479
self.report_tx_metrics(reducer, None, None, Some(metrics));
14791480
}
14801481

@@ -3277,7 +3278,7 @@ mod tests {
32773278
let timestamp = Timestamp::now();
32783279
let workload = |name: &str| {
32793280
Workload::Reducer(ReducerContext {
3280-
name: name.into(),
3281+
name: ReducerName::new_from_str(name),
32813282
caller_identity: Identity::__dummy(),
32823283
caller_connection_id: ConnectionId::ZERO,
32833284
timestamp,
@@ -3468,9 +3469,9 @@ mod tests {
34683469
arg_bsatn,
34693470
} = ReducerContext::try_from(&input).unwrap();
34703471
if i == 0 {
3471-
assert_eq!(reducer_name, "__identity_connected__");
3472+
assert_eq!(&*reducer_name, "__identity_connected__");
34723473
} else {
3473-
assert_eq!(reducer_name, "abstract_concrete_proxy_factory_impl");
3474+
assert_eq!(&*reducer_name, "abstract_concrete_proxy_factory_impl");
34743475
}
34753476
assert!(
34763477
arg_bsatn.is_empty(),

crates/core/src/host/module_host.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ use spacetimedb_query::compile_subscription;
6161
use spacetimedb_sats::{AlgebraicTypeRef, ProductValue};
6262
use spacetimedb_schema::auto_migrate::{AutoMigrateError, MigrationPolicy};
6363
use spacetimedb_schema::def::{ModuleDef, ProcedureDef, ReducerDef, TableDef, ViewDef};
64+
use spacetimedb_schema::reducer_name::ReducerName;
6465
use spacetimedb_schema::schema::{Schema, TableSchema};
6566
use spacetimedb_schema::table_name::TableName;
6667
use spacetimedb_vm::relation::RelValue;
@@ -193,15 +194,15 @@ impl EventStatus {
193194

194195
#[derive(Debug, Clone, Default)]
195196
pub struct ModuleFunctionCall {
196-
pub reducer: String,
197+
pub reducer: ReducerName,
197198
pub reducer_id: ReducerId,
198199
pub args: ArgsTuple,
199200
}
200201

201202
impl ModuleFunctionCall {
202203
pub fn update() -> Self {
203204
Self {
204-
reducer: String::from("update"),
205+
reducer: ReducerName::new_from_str("update"),
205206
reducer_id: u32::MAX.into(),
206207
args: ArgsTuple::nullary(),
207208
}

0 commit comments

Comments
 (0)