use spacetimedb::{reducer, table, view, AnonymousViewContext, Identity, Query, ReducerContext, ViewContext};
#[table(accessor = test)]
struct Test {
#[unique]
id: u32,
#[index(btree)]
x: u32,
}
#[reducer]
fn view_handle_no_iter(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
for _ in read_only.db.test().iter() {}
}
#[reducer]
fn view_handle_no_insert(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().insert(Test { id: 0, x: 0 });
}
#[reducer]
fn view_handle_no_try_insert(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().try_insert(Test { id: 0, x: 0 });
}
#[reducer]
fn view_handle_no_delete(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().delete(Test { id: 0, x: 0 });
}
#[reducer]
fn read_only_unqiue_index_no_delete(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().id().delete(&0);
}
#[reducer]
fn read_only_unqiue_index_no_update(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().id().update(Test { id: 0, x: 0 });
}
#[reducer]
fn read_only_btree_index_no_delete(ctx: &ReducerContext) {
let read_only = ctx.as_read_only();
read_only.db.test().x().delete(0u32..);
}
#[table(accessor = player)]
struct Player {
#[unique]
identity: Identity,
}
struct NotSpacetimeType {}
#[view(accessor = view_def_no_public)]
fn view_def_no_public(_: &ViewContext) -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_dup_public, public, public)]
fn view_def_dup_public() -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_dup_name, name = view_def_dup_name, public)]
fn view_def_dup_name() -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_unsupported_arg, public, anonymous)]
fn view_def_unsupported_arg() -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_no_context, public)]
fn view_def_no_context() -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_wrong_context, public)]
fn view_def_wrong_context(_: &ReducerContext) -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_pass_context_by_value, public)]
fn view_def_pass_context_by_value(_: ViewContext) -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_wrong_context_position, public)]
fn view_def_wrong_context_position(_: &u32, _: &ViewContext) -> Vec<Player> {
vec![]
}
#[view(accessor = view_def_no_return, public)]
fn view_def_no_return(_: &ViewContext) {}
#[view(accessor = view_def_wrong_return, public)]
fn view_def_wrong_return(_: &ViewContext) -> Player {
Player {
identity: Identity::ZERO,
}
}
#[view(accessor = view_def_returns_not_a_spacetime_type, public)]
fn view_def_returns_not_a_spacetime_type(_: &AnonymousViewContext) -> Option<NotSpacetimeType> {
None
}
#[view(accessor = sched_table_view, public)]
fn sched_table_view(_: &ViewContext, _args: ScheduledTable) -> Vec<PlayerInfo> {
vec![]
}
#[table(accessor = player_info)]
struct PlayerInfo {
#[unique]
identity: Identity,
#[index(btree)]
weight: u32,
age: u8,
}
#[view(accessor = view_bad_where, public)]
fn view_bad_where(ctx: &ViewContext) -> impl Query<Player> {
ctx.from.player().r#where(|a| a.identity.eq(42)).build()
}
#[view(accessor = view_bad_where_int_types, public)]
fn view_bad_where_int_types(ctx: &ViewContext) -> impl Query<PlayerInfo> {
ctx.from.player_info().r#where(|a| a.age.eq(4200u32)).build()
}
#[view(accessor = view_bad_join, public)]
fn view_bad_join(ctx: &ViewContext) -> impl Query<PlayerInfo> {
ctx.from
.player_info()
.left_semijoin(ctx.from.player(), |a, b| a.weight.eq(b.identity))
.build()
}
#[view(accessor = view_join_non_indexed_column, public)]
fn view_join_non_indexed_column(ctx: &ViewContext) -> impl Query<PlayerInfo> {
ctx.from
.player()
.right_semijoin(ctx.from.player_info(), |a, b| a.identity.eq(b.age))
.build()
}
#[view(accessor = view_right_join_wrong_return_type, public)]
fn view_right_join_wrong_return_type(ctx: &ViewContext) -> impl Query<Player> {
ctx.from
.player()
.right_semijoin(ctx.from.player_info(), |a, b| a.identity.eq(b.identity))
.build()
}
#[view(accessor = view_nonexistent_table, public)]
fn view_nonexistent_table(ctx: &ViewContext) -> impl Query<T> {
ctx.from.xyz().build()
}
fn main() {}