Skip to content

Commit be76dd3

Browse files
Add mutable getter support for DSL columns (#95)
1 parent 0b3cffa commit be76dd3

File tree

16 files changed

+147
-22
lines changed

16 files changed

+147
-22
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
authors = ["Tamaro Skaljic<mail@tamaro-skaljic.de>"]
33
name = "spacetimedsl"
4-
version = "0.13.1"
4+
version = "0.14.0"
55
edition = "2024"
66
description = "Ergonomic DSL for SpacetimeDB"
77
documentation = "https://docs.rs/spacetimedsl"
@@ -17,7 +17,7 @@ readme = "README.md"
1717
spacetimedb = "1.9.0"
1818

1919
# https://crates.io/crates/spacetimedsl_derive Macros to extend SpacetimeDSL
20-
spacetimedsl_derive = { version = "0.13.1", path = "derive" }
20+
spacetimedsl_derive = { version = "0.14.0", path = "derive" }
2121

2222
# https://crates.io/crates/itertools Extra iterator adaptors, iterator methods, free functions, and macros.
2323
itertools = "^0.14"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ spacetimedsl = { version = "*" }
3636
- [🎛️ Method Configuration](#️-method-configuration) - Explicit control over which operations are allowed on your tables
3737
- [🚨 Rich Error Types](#-the-spacetimedslerror-type) - Detailed error information beyond what SpacetimeDB provides
3838
- [📊 Deletion Results](#-the-deletionresultentry-type) - Complete audit trails for delete operations with cascade tracking
39-
- [🔄 Automatic Accessors](#-accessors-getters-and-setters) - Generated getters and setters with visibility controls
39+
- [🔄 Automatic Accessors](#-accessors-getters-and-setters) - Generated getters, mut-getters and setters with visibility controls
4040

4141
### Implementation Details
4242

@@ -556,7 +556,7 @@ The trait bound `WrapperType: From<NumericType>` is not satisfied.
556556
- Returns reference for normal types
557557
- Returns cloned Wrapper Type for wrapped types
558558

559-
**Setters (for non-private columns):**
559+
**Setters and Mut-Getters (for non-private columns):**
560560

561561
- ✏️ Generated based on column visibility
562562
- Visibility = field visibility

derive-input/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
authors = ["Tamaro Skaljic<mail@tamaro-skaljic.de>"]
33
name = "spacetimedsl_derive-input"
4-
version = "0.13.1"
4+
version = "0.14.0"
55
edition = "2024"
66
description = "Contains structs which represent the input and output of SpacetimeDSL. Can be used by other proc-macro crates to build Macros which utilize SpacetimeDSL under the hood."
77
documentation = "https://docs.rs/spacetimedsl_derive-input"

derive-input/src/api/dsl.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ pub mod reference;
1212

1313
pub mod getter;
1414

15+
pub mod mut_getter;
16+
1517
pub mod setter;
1618

1719
pub mod method;

derive-input/src/api/dsl/column.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{foreign_key::ForeignKey, getter::Getter, setter::Setter, wrapper::WrapperType};
2-
use crate::api::dsl::method::SpacetimeDSLMethod;
2+
use crate::api::dsl::{mut_getter::MutGetter, method::SpacetimeDSLMethod};
33

44
#[derive(Clone)]
55
pub struct SpacetimeDSLColumn {
@@ -10,6 +10,8 @@ pub struct SpacetimeDSLColumn {
1010
pub foreign_key: Option<ForeignKey>,
1111
pub getter: Getter,
1212
// Only `Some(T)` if mutable
13+
pub mut_getter: Option<MutGetter>,
14+
// Only `Some(T)` if mutable
1315
pub setter: Option<Setter>,
1416
}
1517

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use proc_macro2::TokenStream;
2+
use syn::Ident;
3+
4+
use crate::api::rust::visibility::RustVisibility;
5+
6+
#[derive(Clone)]
7+
pub struct MutGetter {
8+
pub method_visibility: RustVisibility,
9+
pub method_name: Ident,
10+
pub return_type: TokenStream,
11+
pub method_impl: TokenStream,
12+
}

derive-input/src/internal/dsl.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ pub mod reference;
1414

1515
pub mod getter;
1616

17+
pub mod mut_getter;
18+
1719
pub mod setter;
1820

1921
pub mod method;

derive-input/src/internal/dsl/column.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::api::{
22
db::column::SpacetimeDBColumn,
33
dsl::{
4-
column::SpacetimeDSLColumn, foreign_key::ForeignKey, getter::Getter, setter::Setter,
5-
wrapper::WrapperType,
4+
column::SpacetimeDSLColumn, foreign_key::ForeignKey, getter::Getter, mut_getter::MutGetter,
5+
setter::Setter, wrapper::WrapperType,
66
},
77
rust::{column::RustField, table::RustStruct},
88
};
@@ -58,13 +58,16 @@ impl SpacetimeDSLColumn {
5858

5959
let getter = Getter::map(rust_field, is_option, &wrapper_type);
6060

61+
let mut_getter = MutGetter::map(rust_field, &wrapper_type);
62+
6163
let setter = Setter::map(rust_field, is_option, &wrapper_type);
6264

6365
Ok(SpacetimeDSLColumn {
6466
is_option,
6567
wrapper_type,
6668
foreign_key,
6769
getter,
70+
mut_getter,
6871
setter,
6972
})
7073
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use crate::api::{
2+
dsl::{mut_getter::MutGetter, wrapper::WrapperType},
3+
rust::{column::RustField, visibility::RustVisibility},
4+
};
5+
use quote::{format_ident, quote};
6+
use syn::Ident;
7+
8+
impl MutGetter {
9+
pub(in crate::internal) fn map(
10+
rust_field: &RustField,
11+
wrapper_type: &Option<WrapperType>,
12+
) -> Option<MutGetter> {
13+
if let RustVisibility::Private = rust_field.visibility {
14+
return None;
15+
};
16+
17+
let column_name = &rust_field.name;
18+
19+
let method_visibility = rust_field.visibility.clone();
20+
let method_name = get_mut_getter_method_name(column_name);
21+
let return_type;
22+
let method_impl;
23+
24+
match wrapper_type {
25+
Some(_) => {
26+
return None;
27+
}
28+
None => {
29+
let rt = &rust_field.type_name_or_path;
30+
return_type = quote! {
31+
&mut #rt
32+
};
33+
34+
method_impl = quote! {
35+
&mut self.#column_name
36+
};
37+
}
38+
};
39+
40+
Some(MutGetter {
41+
method_visibility,
42+
method_name,
43+
return_type,
44+
method_impl,
45+
})
46+
}
47+
}
48+
49+
pub(in crate::internal) fn get_mut_getter_method_name(column_name: &Ident) -> Ident {
50+
format_ident!("get_{column_name}_mut")
51+
}

0 commit comments

Comments
 (0)