tinc 0.2.2

GRPc to REST transcoding library
Documentation
pub mod const_macros;
pub mod wrapper;

pub use tinc_proc_macro::Tracker;

mod oneof;
pub use oneof::*;

mod error;
pub use error::*;

mod tracker;
pub use tracker::*;

mod identifier;
pub use identifier::*;

mod primitive;
pub use primitive::*;

mod map;
pub use map::*;

mod optional;
pub use optional::*;

mod enum_;
pub use enum_::*;

mod struct_;
pub use struct_::*;

mod repeated;
pub use repeated::*;

mod expected;
pub use expected::*;

#[cfg(feature = "prost")]
mod well_known;
#[cfg(feature = "prost")]
pub use well_known::*;

mod deserializer;
pub use deserializer::*;

mod http;
pub use http::*;
pub use tinc_cel as cel;
mod validation;
pub use validation::*;

mod fmt;
pub use fmt::*;

mod bytes;
pub use bytes::*;

mod float_with_non_finite;
pub use float_with_non_finite::*;

#[macro_export]
#[doc(hidden)]
macro_rules! __tinc_field_from_str {
    (
        $s:expr,
        $($literal:literal => $expr:expr),*
        $(,flattened: [$($ident:ident),*$(,)?])?
        $(,)?
    ) => {
        match $s {
            $($literal => Ok($expr),)*
            _ => {
                $($(
                    if let Ok(result) = ::core::str::FromStr::from_str($s) {
                        return Ok(Self::$ident(result));
                    }
                )*)?

                Err(())
            },
        }
    };
}

#[inline(always)]
pub fn tracker_allow_duplicates<T: Tracker>(tracker: Option<&T>) -> bool {
    tracker.is_none_or(|tracker| tracker.allow_duplicates())
}

#[inline(always)]
pub fn serde_ser_skip_default<T: Default + PartialEq>(value: &T) -> bool {
    value == &T::default()
}

pub fn deserialize_tracker_target<'de, D, T>(
    state: &mut TrackerSharedState,
    de: D,
    tracker: &mut T,
    target: &mut T::Target,
) -> Result<(), D::Error>
where
    D: serde::Deserializer<'de>,
    T: TrackerDeserializer<'de>,
{
    tinc_cel::CelMode::Serde.set();
    state.in_scope(|| {
        <T as TrackerDeserializer>::deserialize(
            tracker,
            target,
            SerdeDeserializer {
                deserializer: wrapper::DeserializerWrapper::new(de),
            },
        )
    })
}