diff --git a/temporal_capi/bindings/c/TimeZone.h b/temporal_capi/bindings/c/TimeZone.h index 4bf676383..de5614f90 100644 --- a/temporal_capi/bindings/c/TimeZone.h +++ b/temporal_capi/bindings/c/TimeZone.h @@ -19,12 +19,14 @@ typedef struct temporal_rs_TimeZone_try_from_identifier_str_result {union {TimeZone* ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_result; temporal_rs_TimeZone_try_from_identifier_str_result temporal_rs_TimeZone_try_from_identifier_str(DiplomatStringView ident); -typedef struct temporal_rs_TimeZone_try_from_offset_str_result {union {TimeZone* ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_offset_str_result; -temporal_rs_TimeZone_try_from_offset_str_result temporal_rs_TimeZone_try_from_offset_str(DiplomatStringView ident); - typedef struct temporal_rs_TimeZone_try_from_str_result {union {TimeZone* ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_result; temporal_rs_TimeZone_try_from_str_result temporal_rs_TimeZone_try_from_str(DiplomatStringView ident); +typedef struct temporal_rs_TimeZone_identifier_result {union { TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_identifier_result; +temporal_rs_TimeZone_identifier_result temporal_rs_TimeZone_identifier(const TimeZone* self, DiplomatWrite* write); + +TimeZone* temporal_rs_TimeZone_clone(const TimeZone* self); + bool temporal_rs_TimeZone_is_valid(const TimeZone* self); void temporal_rs_TimeZone_destroy(TimeZone* self); diff --git a/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp b/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp index ace7175e6..2e03c88fc 100644 --- a/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp +++ b/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp @@ -30,10 +30,14 @@ class TimeZone { inline static diplomat::result, temporal_rs::TemporalError> try_from_identifier_str(std::string_view ident); - inline static diplomat::result, temporal_rs::TemporalError> try_from_offset_str(std::string_view ident); - inline static diplomat::result, temporal_rs::TemporalError> try_from_str(std::string_view ident); + inline diplomat::result identifier() const; + template + inline diplomat::result identifier_write(W& writeable_output) const; + + inline std::unique_ptr clone() const; + inline bool is_valid() const; inline const temporal_rs::capi::TimeZone* AsFFI() const; diff --git a/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp b/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp index a9e941cdd..f38ae778b 100644 --- a/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp +++ b/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp @@ -22,12 +22,14 @@ namespace capi { typedef struct temporal_rs_TimeZone_try_from_identifier_str_result {union {temporal_rs::capi::TimeZone* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_result; temporal_rs_TimeZone_try_from_identifier_str_result temporal_rs_TimeZone_try_from_identifier_str(diplomat::capi::DiplomatStringView ident); - typedef struct temporal_rs_TimeZone_try_from_offset_str_result {union {temporal_rs::capi::TimeZone* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_offset_str_result; - temporal_rs_TimeZone_try_from_offset_str_result temporal_rs_TimeZone_try_from_offset_str(diplomat::capi::DiplomatStringView ident); - typedef struct temporal_rs_TimeZone_try_from_str_result {union {temporal_rs::capi::TimeZone* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_result; temporal_rs_TimeZone_try_from_str_result temporal_rs_TimeZone_try_from_str(diplomat::capi::DiplomatStringView ident); + typedef struct temporal_rs_TimeZone_identifier_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_identifier_result; + temporal_rs_TimeZone_identifier_result temporal_rs_TimeZone_identifier(const temporal_rs::capi::TimeZone* self, diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::TimeZone* temporal_rs_TimeZone_clone(const temporal_rs::capi::TimeZone* self); + bool temporal_rs_TimeZone_is_valid(const temporal_rs::capi::TimeZone* self); void temporal_rs_TimeZone_destroy(TimeZone* self); @@ -41,16 +43,31 @@ inline diplomat::result, temporal_rs::Tem return result.is_ok ? diplomat::result, temporal_rs::TemporalError>(diplomat::Ok>(std::unique_ptr(temporal_rs::TimeZone::FromFFI(result.ok)))) : diplomat::result, temporal_rs::TemporalError>(diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); } -inline diplomat::result, temporal_rs::TemporalError> temporal_rs::TimeZone::try_from_offset_str(std::string_view ident) { - auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_offset_str({ident.data(), ident.size()}); - return result.is_ok ? diplomat::result, temporal_rs::TemporalError>(diplomat::Ok>(std::unique_ptr(temporal_rs::TimeZone::FromFFI(result.ok)))) : diplomat::result, temporal_rs::TemporalError>(diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); -} - inline diplomat::result, temporal_rs::TemporalError> temporal_rs::TimeZone::try_from_str(std::string_view ident) { auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_str({ident.data(), ident.size()}); return result.is_ok ? diplomat::result, temporal_rs::TemporalError>(diplomat::Ok>(std::unique_ptr(temporal_rs::TimeZone::FromFFI(result.ok)))) : diplomat::result, temporal_rs::TemporalError>(diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); } +inline diplomat::result temporal_rs::TimeZone::identifier() const { + std::string output; + diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_TimeZone_identifier(this->AsFFI(), + &write); + return result.is_ok ? diplomat::result(diplomat::Ok(std::move(output))) : diplomat::result(diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline diplomat::result temporal_rs::TimeZone::identifier_write(W& writeable) const { + diplomat::capi::DiplomatWrite write = diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_TimeZone_identifier(this->AsFFI(), + &write); + return result.is_ok ? diplomat::result(diplomat::Ok()) : diplomat::result(diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::TimeZone::clone() const { + auto result = temporal_rs::capi::temporal_rs_TimeZone_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::TimeZone::FromFFI(result)); +} + inline bool temporal_rs::TimeZone::is_valid() const { auto result = temporal_rs::capi::temporal_rs_TimeZone_is_valid(this->AsFFI()); return result; diff --git a/temporal_capi/src/time_zone.rs b/temporal_capi/src/time_zone.rs index c8f470665..1f0f5bf2d 100644 --- a/temporal_capi/src/time_zone.rs +++ b/temporal_capi/src/time_zone.rs @@ -4,7 +4,9 @@ pub mod ffi { use crate::error::ffi::TemporalError; use alloc::boxed::Box; + use core::fmt::Write; use core::str; + use diplomat_runtime::DiplomatWrite; #[diplomat::opaque] #[diplomat::transparent_convert] @@ -19,11 +21,6 @@ pub mod ffi { .map(|x| Box::new(TimeZone(x))) .map_err(Into::into) } - pub fn try_from_offset_str(ident: &DiplomatStr) -> Result, TemporalError> { - temporal_rs::UtcOffset::from_utf8(ident) - .map(|x| Box::new(TimeZone(temporal_rs::TimeZone::UtcOffset(x)))) - .map_err(Into::into) - } pub fn try_from_str(ident: &DiplomatStr) -> Result, TemporalError> { let Ok(ident) = str::from_utf8(ident) else { return Err(temporal_rs::TemporalError::range().into()); @@ -33,6 +30,22 @@ pub mod ffi { .map_err(Into::into) } + pub fn identifier(&self, write: &mut DiplomatWrite) -> Result<(), TemporalError> { + // TODO ideally this would use Writeable instead of allocating + let s = self.0.identifier()?; + + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = write.write_str(&s); + + Ok(()) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(TimeZone(self.0.clone())) + } + #[cfg(feature = "compiled_data")] pub fn is_valid(&self) -> bool { self.0.is_valid()