Skip to content

Conversation

@mamcx
Copy link
Contributor

@mamcx mamcx commented Nov 27, 2025

Description of Changes

Closes #3673

NOTE: C++ part will be in another PR

Expected complexity level and risk

2

Adding a new type touch everywhere

Testing

  • Adding smoke and unit test

@mamcx mamcx self-assigned this Nov 27, 2025
@mamcx mamcx added the release-any To be landed in any release window label Nov 27, 2025
@mamcx mamcx force-pushed the mamcx/result-type branch from 70ca89a to 4324cd7 Compare November 27, 2025 18:50
@mamcx mamcx requested a review from gefjon November 27, 2025 19:01
@JasonAtClockwork
Copy link
Contributor

I'll build out an attached PR to add the new functionality for the Unreal SDK.

@mamcx mamcx force-pushed the mamcx/result-type branch 3 times, most recently from 5a99c91 to cf9dd2f Compare December 15, 2025 15:20
@mamcx mamcx marked this pull request as ready for review December 15, 2025 16:50
Copy link
Contributor

@JasonAtClockwork JasonAtClockwork left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is updates to the /modules/sdk-test-cs but this won't be enough testing for the C# side. We'll need to add tests into the /sdks/csharp/examples~/regression-tests like for UUID to make sure this works end-to-end.

@rekhoff - I'll also want your eyes on this one when you can for the C# side

/// <summary>
/// Get the name of the BSATN struct for this type.
/// </summary>
public virtual string to_bsatn_string()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing this was added as the Result has two types and that was giving trouble with the BSATNName property directly?

Two notes on this, this should be ToBSATNString() or something like it to match PascalCase for the C# convention followed in all the other code. Second BSATNName was heavily used in CodeGen/Module.cs and doesn't seem to be updated in all locations. This will need review to make sure it won't cause problems for Result<> types used throughout the codegen.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, for things like:

SpacetimeDB.Result<SpacetimeDB.Sdk.Test.Module.EveryPrimitiveStruct, string>.BSATN<SpacetimeDB.Sdk.Test.Module.EveryPrimitiveStruct, string, SpacetimeDB.Sdk.Test.Module.EveryPrimitiveStruct.BSATN, SpacetimeDB.BSATN.String> rRW = new();

But is not possible to just pass the BSATNName everywhere, I need to manually pick some places.

Copy link
Contributor

@gefjon gefjon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy with the Rust parts of this PR. We'll still need review from the other languages' maintainers.

}

/// <summary>
/// A use of a Result<T, E> type.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will confuse the XML parser. We should use the &lt; and &gt; versions of the characters in summary blocks.

Suggested change
/// A use of a Result<T, E> type.
/// A use of a Result&lt;T, E&gt; type.

Copy link
Contributor

@rekhoff rekhoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The C# side looks good. I did some local testing of end-to-end behavior, and things look good.

Copy link
Collaborator

@coolreader18 coolreader18 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems reasonable to me, except for my one comment.

}

/// Converts `self` into an `Result<AlgebraicValue, AlgebraicValue>`, if applicable.
pub fn into_result(self) -> Result<Self, Self> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be -> Result<Result<AlgebraicType, AlgebraicType>, Self>?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mm, this is like the option variant:

/// Converts `self` into an `Option<AlgebraicValue>`, if applicable.
    pub fn into_option(self) -> Result<Option<Self>, Self> {
        match self {
            AlgebraicValue::Sum(sum_value) => match sum_value.tag {
                0 => Ok(Some(*sum_value.value)),
                1 => Ok(None),
                _ => Err(AlgebraicValue::Sum(sum_value)),
            },
            _ => Err(self),
        }
    }

@mamcx mamcx force-pushed the mamcx/result-type branch from cf9dd2f to af676ab Compare December 23, 2025 15:55
@mamcx mamcx force-pushed the mamcx/result-type branch from af676ab to 604c452 Compare December 23, 2025 18:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release-any To be landed in any release window

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SpacetimeType for Result<T, E>

6 participants