Skip to main content

Via

Struct Via 

Source
pub struct Via {
    pub target: ModelId,
    pub expr_ty: Type,
    pub cardinality: Cardinality,
    pub path: Path,
    pub terminal: Option<usize>,
}
Expand description

A multi-step relation path.

A Has relation declared with #[has_many(via = a.b)] or #[has_one(via = a.b)] reaches its target by following a path of existing relations rather than pairing with a single BelongsTo. The path is resolved at macro-expansion time — the derive emits a chained call on the model’s Fields struct (e.g. User::fields().comments().article()) and converts it into a stmt::Path, so a misspelled or otherwise unresolvable segment is a Rust compile error rather than a runtime schema validation failure.

The terminal segment of the path is usually another relation (the via reaches a model). It may also be a scalar field, in which case the via projects that field through the relation path — e.g. #[has_many(via = todos.tags.name)] tag_names: Vec<String> collects the name of every tag reachable through todos. For a scalar terminal, terminal holds the terminal field’s index on target (the model the relation chain reaches), and path still includes that terminal step as its last element.

Fields§

§target: ModelId

The ModelId of the model the relation chain reaches. For a relation terminal this is the associated (target) model; for a scalar terminal it is the model that owns the projected terminal field.

§expr_ty: Type

The expression type this field evaluates to from the application’s perspective.

§cardinality: Cardinality

Whether this relation is one-to-many or one-to-one.

§path: Path

The resolved field path, rooted at the model that declares the via relation. When terminal is Some, the last element of the path is the scalar terminal field (on target) and the preceding elements form the relation chain.

§terminal: Option<usize>

For a scalar-terminal via, the index of the projected terminal field on target. None when the via reaches a model (the terminal segment is itself a relation).

Implementations§

Source§

impl Via

Source

pub fn new( target: ModelId, expr_ty: Type, cardinality: Cardinality, path: Path, terminal: Option<usize>, ) -> Self

Create a Via from its fully resolved field path.

Source

pub fn is_scalar(&self) -> bool

Returns true when the via projects a scalar terminal field rather than reaching a model.

Source

pub fn is_many(&self) -> bool

Returns true when this is a one-to-many relation.

Source

pub fn is_one(&self) -> bool

Returns true when this is a one-to-one relation.

Source

pub fn singular(&self) -> Option<&Name>

Returns the singular item name for a one-to-many relation.

Source

pub fn target<'a>(&self, schema: &'a Schema) -> &'a Model

Resolves the target Model from the given schema.

Trait Implementations§

Source§

impl Clone for Via

Source§

fn clone(&self) -> Via

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Via

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Via

§

impl RefUnwindSafe for Via

§

impl Send for Via

§

impl Sync for Via

§

impl Unpin for Via

§

impl UnsafeUnpin for Via

§

impl UnwindSafe for Via

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more