lref 0.1.1

Rust Entity Framework - An EFCore-inspired ORM for Rust
Documentation
//! Entity type trait and state definitions.

use crate::metadata::EntityTypeMeta;
use crate::error::LrefResult;
use crate::provider::DbValue;
use std::collections::HashMap;

/// Represents the state of an entity in the change tracker.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EntityState {
    Detached,
    Added,
    Unchanged,
    Modified,
    Deleted,
}

/// The core trait that every entity type must implement.
pub trait EntityType: Send + Sync + 'static {
    fn entity_meta() -> EntityTypeMeta
    where
        Self: Sized;

    fn entity_meta_instance(&self) -> EntityTypeMeta
    where
        Self: Sized,
    {
        Self::entity_meta()
    }
}

/// Trait for materializing an entity from a database row.
///
/// Auto-generated by `#[derive(EntityType)]`.
pub trait FromRow: EntityType + Sized {
    fn from_row(values: &[String]) -> LrefResult<Self>;
}

/// Extracts primary key values from an entity for SaveChanges WHERE clauses.
///
/// Auto-generated by `#[derive(EntityType)]`.
pub trait GetKeyValues: EntityType {
    fn key_values(&self) -> HashMap<String, DbValue>;
}

/// Extracts all scalar property values from an entity for INSERT/UPDATE.
///
/// Auto-generated by `#[derive(EntityType)]`.
pub trait EntitySnapshot: EntityType {
    fn snapshot(&self) -> HashMap<String, DbValue>;
}