pub struct Duration {
pub seconds: i64,
pub nanos: i32,
/* private fields */
}Expand description
A Duration represents a signed, fixed-length span of time represented as a count of seconds and fractions of seconds at nanosecond resolution. It is independent of any calendar and concepts like “day” or “month”. It is related to Timestamp in that the difference between two Timestamp values is a Duration and it can be added or subtracted from a Timestamp. Range is approximately +-10,000 years.
§Examples
Example 1: Compute Duration from two Timestamps in pseudo code.
Timestamp start = ...;
Timestamp end = ...;
Duration duration = ...;
duration.seconds = end.seconds - start.seconds;
duration.nanos = end.nanos - start.nanos;
if (duration.seconds < 0 && duration.nanos > 0) {
duration.seconds += 1;
duration.nanos -= 1000000000;
} else if (duration.seconds > 0 && duration.nanos < 0) {
duration.seconds -= 1;
duration.nanos += 1000000000;
}Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
Timestamp start = ...;
Duration duration = ...;
Timestamp end = ...;
end.seconds = start.seconds + duration.seconds;
end.nanos = start.nanos + duration.nanos;
if (end.nanos < 0) {
end.seconds -= 1;
end.nanos += 1000000000;
} else if (end.nanos >= 1000000000) {
end.seconds += 1;
end.nanos -= 1000000000;
}Example 3: Compute Duration from datetime.timedelta in Python.
td = datetime.timedelta(days=3, minutes=10)
duration = Duration()
duration.FromTimedelta(td)§JSON Mapping
In JSON format, the Duration type is encoded as a string rather than an object, where the string ends in the suffix “s” (indicating seconds) and is preceded by the number of seconds, with nanoseconds expressed as fractional seconds. For example, 3 seconds with 0 nanoseconds should be encoded in JSON format as “3s”, while 3 seconds and 1 nanosecond should be expressed in JSON format as “3.000000001s”, and 3 seconds and 1 microsecond should be expressed in JSON format as “3.000001s”.
Fields§
§seconds: i64Signed seconds of the span of time. Must be from -315,576,000,000 to +315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
Field 1: seconds
nanos: i32Signed fractions of a second at nanosecond resolution of the span
of time. Durations less than one second are represented with a 0
seconds field and a positive or negative nanos field. For durations
of one second or more, a non-zero value for the nanos field must be
of the same sign as the seconds field. Must be from -999,999,999
to +999,999,999 inclusive.
Field 2: nanos
Implementations§
Source§impl Duration
impl Duration
Sourcepub fn from_secs_nanos(seconds: i64, nanos: i32) -> Self
pub fn from_secs_nanos(seconds: i64, nanos: i32) -> Self
Create a Duration from seconds and nanoseconds.
§Panics
Panics in debug mode if nanos is outside [-999_999_999, 999_999_999]
or if its sign is inconsistent with seconds. When seconds is zero,
nanos may be positive, negative, or zero. In release mode the value
is stored as-is. Use Duration::from_secs_nanos_checked for a variant
that returns None on invalid input.
Sourcepub fn from_secs_nanos_checked(seconds: i64, nanos: i32) -> Option<Self>
pub fn from_secs_nanos_checked(seconds: i64, nanos: i32) -> Option<Self>
Create a Duration from seconds and nanoseconds, returning None
if nanos is out of range or has a sign inconsistent with seconds.
Sourcepub fn from_millis(millis: i64) -> Self
pub fn from_millis(millis: i64) -> Self
Create a Duration from a number of milliseconds.
The sign of millis determines the sign of both seconds and the
sub-second nanos field, per the protobuf sign-consistency rule.
Sourcepub fn from_micros(micros: i64) -> Self
pub fn from_micros(micros: i64) -> Self
Create a Duration from a number of microseconds.
Sourcepub fn from_nanos(nanos: i64) -> Self
pub fn from_nanos(nanos: i64) -> Self
Create a Duration from a number of nanoseconds.
Trait Implementations§
Source§impl<'arbitrary> Arbitrary<'arbitrary> for Duration
Available on crate feature arbitrary only.
impl<'arbitrary> Arbitrary<'arbitrary> for Duration
arbitrary only.Source§fn arbitrary(u: &mut Unstructured<'arbitrary>) -> Result<Self>
fn arbitrary(u: &mut Unstructured<'arbitrary>) -> Result<Self>
Self from the given unstructured data. Read moreSource§fn arbitrary_take_rest(u: Unstructured<'arbitrary>) -> Result<Self>
fn arbitrary_take_rest(u: Unstructured<'arbitrary>) -> Result<Self>
Self from the entirety of the given
unstructured data. Read moreSource§fn size_hint(depth: usize) -> (usize, Option<usize>)
fn size_hint(depth: usize) -> (usize, Option<usize>)
Unstructured this type
needs to construct itself. Read moreSource§fn try_size_hint(
depth: usize,
) -> Result<(usize, Option<usize>), MaxRecursionReached>
fn try_size_hint( depth: usize, ) -> Result<(usize, Option<usize>), MaxRecursionReached>
Unstructured this type
needs to construct itself. Read moreSource§impl DefaultInstance for Duration
impl DefaultInstance for Duration
Source§fn default_instance() -> &'static Self
fn default_instance() -> &'static Self
Source§impl<'de> Deserialize<'de> for Duration
Available on crate feature json only.
impl<'de> Deserialize<'de> for Duration
json only.Source§fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
Deserializes from a decimal seconds string (e.g. "1.5s").
Source§impl ExtensionSet for Duration
impl ExtensionSet for Duration
Source§const PROTO_FQN: &'static str = "google.protobuf.Duration"
const PROTO_FQN: &'static str = "google.protobuf.Duration"
"google.protobuf.FieldOptions". Read moreSource§fn unknown_fields(&self) -> &UnknownFields
fn unknown_fields(&self) -> &UnknownFields
Source§fn unknown_fields_mut(&mut self) -> &mut UnknownFields
fn unknown_fields_mut(&mut self) -> &mut UnknownFields
Source§fn extension<C>(&self, ext: &Extension<C>) -> <C as ExtensionCodec>::Outputwhere
C: ExtensionCodec,
fn extension<C>(&self, ext: &Extension<C>) -> <C as ExtensionCodec>::Outputwhere
C: ExtensionCodec,
Source§fn set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
)where
C: ExtensionCodec,
fn set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
)where
C: ExtensionCodec,
Source§fn try_set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
) -> Result<(), EncodeError>where
C: ExtensionCodec,
fn try_set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
) -> Result<(), EncodeError>where
C: ExtensionCodec,
MAX_MESSAGE_BYTES). Read moreSource§fn has_extension<C>(&self, ext: &Extension<C>) -> boolwhere
C: ExtensionCodec,
fn has_extension<C>(&self, ext: &Extension<C>) -> boolwhere
C: ExtensionCodec,
true if any record at the extension’s field number is present. Read moreSource§fn clear_extension<C>(&mut self, ext: &Extension<C>)where
C: ExtensionCodec,
fn clear_extension<C>(&mut self, ext: &Extension<C>)where
C: ExtensionCodec,
Source§fn extension_or_default<C>(
&self,
ext: &Extension<C>,
) -> <C as ExtensionCodec>::Valuewhere
C: ExtensionCodec<Output = Option<<C as ExtensionCodec>::Value>>,
<C as ExtensionCodec>::Value: Default,
fn extension_or_default<C>(
&self,
ext: &Extension<C>,
) -> <C as ExtensionCodec>::Valuewhere
C: ExtensionCodec<Output = Option<<C as ExtensionCodec>::Value>>,
<C as ExtensionCodec>::Value: Default,
[default = ...]
value if absent, or the type’s Default if no proto default was declared. Read moreSource§impl From<SignedDuration> for Duration
Available on crate feature jiff only.
impl From<SignedDuration> for Duration
jiff only.Source§fn from(d: SignedDuration) -> Self
fn from(d: SignedDuration) -> Self
Convert a jiff::SignedDuration to a protobuf Duration.
Infallible: both types represent a signed duration as a sign-consistent
seconds + sub-second nanos pair, so this is a direct field copy.
§Warning: proto JSON spec range
jiff::SignedDuration ranges to ±i64::MAX seconds (~2.9e11 years),
while the proto spec restricts Duration to ±315,576,000,000 seconds
(~10,000 years). A SignedDuration beyond that converts without error
here — binary encoding round-trips it — but the resulting Duration
will fail JSON serialization (json feature), which enforces the spec
range.
§Examples
use buffa_types::Duration;
let sd = jiff::SignedDuration::new(1, 500_000_000);
let proto: Duration = sd.into();
assert_eq!(proto.seconds, 1);
assert_eq!(proto.nanos, 500_000_000);Source§impl From<TimeDelta> for Duration
Available on crate feature chrono only.
impl From<TimeDelta> for Duration
chrono only.Source§fn from(d: TimeDelta) -> Self
fn from(d: TimeDelta) -> Self
Convert a chrono::TimeDelta to a protobuf Duration.
Both sides represent a signed duration as seconds + subsec_nanos
with sign-consistent components, so this is a direct field copy.
§Warning: proto JSON spec range
chrono::TimeDelta ranges to ±i64::MAX milliseconds (~9.2e15
seconds), while the proto spec restricts Duration to
±315,576,000,000 seconds (~10,000 years). A TimeDelta beyond that
converts without error here — binary encoding round-trips it — but
the resulting Duration will fail JSON serialization (json
feature), which enforces the spec range.
§Examples
use buffa_types::Duration;
use chrono::TimeDelta;
let proto: Duration = TimeDelta::milliseconds(1_500).into();
assert_eq!(proto.seconds, 1);
assert_eq!(proto.nanos, 500_000_000);Source§impl HasMessageView for Duration
impl HasMessageView for Duration
Source§type View<'a> = DurationView<'a>
type View<'a> = DurationView<'a>
Self, borrowing from a buffer with lifetime
'a.Source§type ViewHandle = DurationOwnedView
type ViewHandle = DurationOwnedView
'static owned-view handle for Self
(FooOwnedView).Source§fn decode_view(buf: &[u8]) -> Result<Self::View<'_>, DecodeError>
fn decode_view(buf: &[u8]) -> Result<Self::View<'_>, DecodeError>
Source§fn decode_view_with_options<'a>(
buf: &'a [u8],
opts: &DecodeOptions,
) -> Result<Self::View<'a>, DecodeError>
fn decode_view_with_options<'a>( buf: &'a [u8], opts: &DecodeOptions, ) -> Result<Self::View<'a>, DecodeError>
View under custom
DecodeOptions (recursion limit, max message
size, unknown-field limit). Read moreSource§fn decode_view_handle(bytes: Bytes) -> Result<Self::ViewHandle, DecodeError>
fn decode_view_handle(bytes: Bytes) -> Result<Self::ViewHandle, DecodeError>
Source§fn decode_view_handle_with_options(
bytes: Bytes,
opts: &DecodeOptions,
) -> Result<Self::ViewHandle, DecodeError>
fn decode_view_handle_with_options( bytes: Bytes, opts: &DecodeOptions, ) -> Result<Self::ViewHandle, DecodeError>
Source§impl Message for Duration
impl Message for Duration
Source§fn compute_size(&self, _cache: &mut SizeCache) -> u32
fn compute_size(&self, _cache: &mut SizeCache) -> u32
Returns the total encoded size in bytes.
Accumulates in u64 (which cannot overflow for in-memory
data) and saturates to u32 at return, so a message whose
encoded size exceeds the 2 GiB protobuf limit yields a value
above ::buffa::MAX_MESSAGE_BYTES that the encode entry
points reject, never a silently wrapped size.
Source§fn write_to(&self, _cache: &mut SizeCache, buf: &mut impl EncodeSink)
fn write_to(&self, _cache: &mut SizeCache, buf: &mut impl EncodeSink)
cache (populated by a prior
compute_size call on the same cache). Read moreSource§fn merge_field(
&mut self,
tag: Tag,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge_field( &mut self, tag: Tag, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
buf. Read moreSource§fn encode(&self, buf: &mut impl EncodeSink)
fn encode(&self, buf: &mut impl EncodeSink)
Source§fn try_encode(&self, buf: &mut impl EncodeSink) -> Result<(), EncodeError>
fn try_encode(&self, buf: &mut impl EncodeSink) -> Result<(), EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn encode_with_cache(&self, cache: &mut SizeCache, buf: &mut impl EncodeSink)
fn encode_with_cache(&self, cache: &mut SizeCache, buf: &mut impl EncodeSink)
Source§fn try_encode_with_cache(
&self,
cache: &mut SizeCache,
buf: &mut impl EncodeSink,
) -> Result<(), EncodeError>
fn try_encode_with_cache( &self, cache: &mut SizeCache, buf: &mut impl EncodeSink, ) -> Result<(), EncodeError>
SizeCache,
returning an error instead of panicking if the encoded size exceeds
the 2 GiB protobuf limit (MAX_MESSAGE_BYTES). Clears the cache
first. Read moreSource§fn try_encode_bounded(
&self,
max_bytes: u32,
buf: &mut impl EncodeSink,
) -> Result<u32, EncodeError>
fn try_encode_bounded( &self, max_bytes: u32, buf: &mut impl EncodeSink, ) -> Result<u32, EncodeError>
buf only if its encoded size fits within
max_bytes, using a single size pass that is then reused for the write. Read moreSource§fn try_encode_bounded_with_cache(
&self,
max_bytes: u32,
cache: &mut SizeCache,
buf: &mut impl EncodeSink,
) -> Result<u32, EncodeError>
fn try_encode_bounded_with_cache( &self, max_bytes: u32, cache: &mut SizeCache, buf: &mut impl EncodeSink, ) -> Result<u32, EncodeError>
Source§fn encoded_len(&self) -> u32
fn encoded_len(&self) -> u32
Source§fn try_encoded_len(&self) -> Result<u32, EncodeError>
fn try_encoded_len(&self) -> Result<u32, EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn encode_length_delimited(&self, buf: &mut impl EncodeSink)
fn encode_length_delimited(&self, buf: &mut impl EncodeSink)
Source§fn try_encode_length_delimited(
&self,
buf: &mut impl EncodeSink,
) -> Result<(), EncodeError>
fn try_encode_length_delimited( &self, buf: &mut impl EncodeSink, ) -> Result<(), EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn try_encode_to_vec(&self) -> Result<Vec<u8>, EncodeError>
fn try_encode_to_vec(&self) -> Result<Vec<u8>, EncodeError>
Vec<u8>, returning an error instead of panicking
if the encoded size exceeds the 2 GiB protobuf limit
(MAX_MESSAGE_BYTES). Read moreSource§fn encode_to_bytes(&self) -> Bytes
fn encode_to_bytes(&self) -> Bytes
bytes::Bytes. Read moreSource§fn try_encode_to_bytes(&self) -> Result<Bytes, EncodeError>
fn try_encode_to_bytes(&self) -> Result<Bytes, EncodeError>
bytes::Bytes, returning an error instead of
panicking if the encoded size exceeds the 2 GiB protobuf limit
(MAX_MESSAGE_BYTES). Read moreSource§fn decode(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
fn decode(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn decode_from_slice(data: &[u8]) -> Result<Self, DecodeError>where
Self: Sized,
fn decode_from_slice(data: &[u8]) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn decode_length_delimited(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
fn decode_length_delimited(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn merge_to_limit(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
limit: usize,
) -> Result<(), DecodeError>
fn merge_to_limit( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, limit: usize, ) -> Result<(), DecodeError>
Source§fn merge_group(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
field_number: u32,
) -> Result<(), DecodeError>
fn merge_group( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, field_number: u32, ) -> Result<(), DecodeError>
buf, reading fields until an
EndGroup tag with the given field_number is encountered. Read moreSource§fn merge(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
Source§fn merge_from_slice(&mut self, data: &[u8]) -> Result<(), DecodeError>
fn merge_from_slice(&mut self, data: &[u8]) -> Result<(), DecodeError>
Source§fn merge_length_delimited(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge_length_delimited( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
Source§impl MessageName for Duration
impl MessageName for Duration
Source§const PACKAGE: &'static str = "google.protobuf"
const PACKAGE: &'static str = "google.protobuf"
Source§const NAME: &'static str = "Duration"
const NAME: &'static str = "Duration"
. between nesting levels. Read moreSource§impl ReflectElement for Duration
Available on crate feature reflect only.
impl ReflectElement for Duration
reflect only.Source§fn as_value_ref(&self) -> ValueRef<'_>
fn as_value_ref(&self) -> ValueRef<'_>
ValueRef.Source§impl ReflectMessage for Duration
Available on crate feature reflect only.
impl ReflectMessage for Duration
reflect only.Source§fn message_descriptor(&self) -> &MessageDescriptor
fn message_descriptor(&self) -> &MessageDescriptor
Source§fn pool(&self) -> &Arc<DescriptorPool> ⓘ
fn pool(&self) -> &Arc<DescriptorPool> ⓘ
MessageIndex /
EnumIndex from FieldKind,
or Arc::clone it to construct sibling DynamicMessages while
navigating nested fields.Source§fn unknown_fields(&self) -> &UnknownFields
fn unknown_fields(&self) -> &UnknownFields
Source§fn for_each_set(&self, f: &mut dyn FnMut(&FieldDescriptor, ValueRef<'_>))
fn for_each_set(&self, f: &mut dyn FnMut(&FieldDescriptor, ValueRef<'_>))
Source§fn to_dynamic(&self) -> DynamicMessage
fn to_dynamic(&self) -> DynamicMessage
DynamicMessage. Read moreSource§fn which_oneof(&self, oneof: &OneofDescriptor) -> Option<&FieldDescriptor>
fn which_oneof(&self, oneof: &OneofDescriptor) -> Option<&FieldDescriptor>
oneof is set, if any. Read moreSource§impl Reflectable for Duration
Available on crate feature reflect only.
impl Reflectable for Duration
reflect only.Source§fn reflect(&self) -> ReflectCow<'_>
fn reflect(&self) -> ReflectCow<'_>
Vtable-mode reflective handle: borrows self directly. No
encode/decode round-trip and no allocation — the reflective
accessors read this message’s fields in place.
impl StructuralPartialEq for Duration
Source§impl TextFormat for Duration
impl TextFormat for Duration
Source§fn encode_text(&self, enc: &mut TextEncoder<'_>) -> Result
fn encode_text(&self, enc: &mut TextEncoder<'_>) -> Result
enc. Read moreSource§fn merge_text(&mut self, dec: &mut TextDecoder<'_>) -> Result<(), ParseError>
fn merge_text(&mut self, dec: &mut TextDecoder<'_>) -> Result<(), ParseError>
dec into this message. Read moreSource§impl TryFrom<Duration> for Duration
Available on crate feature std only.
impl TryFrom<Duration> for Duration
std only.Source§fn try_from(d: Duration) -> Result<Self, Self::Error>
fn try_from(d: Duration) -> Result<Self, Self::Error>
Convert a protobuf Duration to a std::time::Duration.
§Errors
Returns DurationError::InvalidNanos if nanos is outside
[-999_999_999, 999_999_999] or if its sign is inconsistent with
seconds (e.g. positive nanos with negative seconds).
Returns DurationError::NegativeDuration if the duration is
negative but otherwise well-formed (e.g. seconds < 0, nanos ≤ 0),
since std::time::Duration cannot represent negative values.
Source§type Error = DurationError
type Error = DurationError
Source§impl TryFrom<Duration> for TimeDelta
Available on crate feature chrono only.
impl TryFrom<Duration> for TimeDelta
chrono only.Source§fn try_from(d: Duration) -> Result<Self, Self::Error>
fn try_from(d: Duration) -> Result<Self, Self::Error>
Convert a protobuf Duration to a chrono::TimeDelta.
§Examples
use buffa_types::{Duration, DurationChronoError};
use chrono::TimeDelta;
let proto = Duration {
seconds: 2,
nanos: 250_000_000,
..Default::default()
};
let td: TimeDelta = proto.try_into().unwrap();
assert_eq!(td, TimeDelta::milliseconds(2_250));
let too_big = Duration {
seconds: i64::MAX,
nanos: 0,
..Default::default()
};
assert_eq!(
TimeDelta::try_from(too_big),
Err(DurationChronoError::Overflow)
);§Errors
Returns DurationChronoError::InvalidNanos if nanos is outside
[-999_999_999, 999_999_999] or if its sign is inconsistent with
seconds. Such values never come from the From<chrono::TimeDelta>
impl, but seconds and nanos are independent wire fields, so a
decoded Duration can carry any combination — the proto spec declares
sign-mismatched ones invalid, and this conversion rejects them rather
than silently reinterpreting them arithmetically.
Returns DurationChronoError::Overflow if the total duration
exceeds chrono::TimeDelta’s representable range (±i64::MAX
milliseconds).
Source§type Error = DurationChronoError
type Error = DurationChronoError
Source§impl TryFrom<Duration> for SignedDuration
Available on crate feature jiff only.
impl TryFrom<Duration> for SignedDuration
jiff only.Source§fn try_from(d: Duration) -> Result<Self, Self::Error>
fn try_from(d: Duration) -> Result<Self, Self::Error>
Convert a protobuf Duration to a jiff::SignedDuration.
§Examples
use buffa_types::Duration;
let proto = Duration {
seconds: 2,
nanos: 250_000_000,
..Default::default()
};
let sd: jiff::SignedDuration = proto.try_into().unwrap();
assert_eq!(sd, jiff::SignedDuration::new(2, 250_000_000));§Errors
Returns DurationJiffError::InvalidNanos if nanos is outside
[-999_999_999, 999_999_999] or if its sign is inconsistent with
seconds. Such values never come from the From<jiff::SignedDuration>
impl, but seconds and nanos are independent wire fields, so a decoded
Duration can carry any combination — the proto spec declares
sign-mismatched ones invalid, and this conversion rejects them rather
than letting SignedDuration::new silently re-normalize them.