mirror of
https://github.com/clockworklabs/SpacetimeDB.git
synced 2026-05-15 04:08:02 -04:00
a546bc8961
# Description of Changes This is the implementation of issue #3191. This adds a Default attribute to C# module fields. **Note**: In C#, attribute arguments must be compile-time constants, which means you can't directly use non-constant expressions like new expressions, method calls, or dynamic values in attribute constructors. (Ref: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/attributes#2324-attribute-parameter-types) For this reason, these default values are limited to primitive types, enums, and strings. This includes (shown as `C# Type` (`BSATN type`): * `bool` (`Bool`) * `sbyte` (`I8`) * `byte` (`U8`) * `short` (`I16`) * `ushort` (`U16`) * `int` (`I32`) * `unit` (`U32`) * `long` (`I64`) * `ulong` (`U64`) * `float` (`F32`) * `double` (`F64`) * `enum` (`Enum`) * `string` (`String`) * `null` (`RefOption`) <- Nullable type Because of C# limitations, for nullable and complex data types, such as a struct, can take use `[Default(null)]` to populate values with null defaults. This allows things like structs to workaround the non-constant expressions in attribute constructors limitation by allowing these complex types to still be able to be added as new column tables. The `int` type can also be in the form of Hex or Binary literals, such as `[Default(0x2A)]` or `[Default(0b00101010)]` Both Decimal (like `[Default(3.14m)]`) and Char (like `[Default('A')]`) are unsupported types in BSATN and will still return `BSATN0001` errors. # API and ABI breaking changes Not API breaking. This change only adds the `[Default(value)]` attribute logic. Using the `[Default(value)]` attribute with older versions SpacetimeDB C# modules will result in an error. # Expected complexity level and risk 2 # Testing Local testing of this requires use of CLI changes in #3278 - [x] Regression test of functionality added.
20 lines
549 B
C#
20 lines
549 B
C#
using SpacetimeDB;
|
|
|
|
public static partial class Module
|
|
{
|
|
[SpacetimeDB.Table(Name = "ExampleData", Public = true)]
|
|
public partial struct ExampleData
|
|
{
|
|
[SpacetimeDB.PrimaryKey]
|
|
public uint Primary;
|
|
public uint TestPass;
|
|
}
|
|
|
|
[SpacetimeDB.Reducer]
|
|
public static void Insert(ReducerContext ctx, uint id)
|
|
{
|
|
var exampleData = ctx.Db.ExampleData.Insert(new ExampleData { Primary = id, TestPass = 1 });
|
|
Log.Info($"Inserted key {exampleData.Primary} on pass {exampleData.TestPass}");
|
|
}
|
|
}
|