crash_orm 0.7.2

A simple, typed ORM for Postgres
//! See [VirtualColumn].

use std::marker::PhantomData;

pub use avg_column::*;
pub use count_column::*;
pub use max_column::*;
pub use min_column::*;
pub use round_column::*;
pub use sqrt_column::*;
pub use string_column::*;
pub use sum_column::*;
pub use text_cast_column::*;

use crate::prelude::{BoxedSql, ColumnType, Entity};

mod string_column;
mod round_column;
mod sqrt_column;
mod text_cast_column;
mod count_column;
mod avg_column;
mod sum_column;
mod min_column;
mod max_column;

/// Struct holding information about a non-existing column. This can be for example SQRT(number).
///
/// These columns can be automatically generated by calling the corresponding functions, you cannot create them yourself!
///
/// This also means, that you cannot add your own virtual columns.
/// If you need more virtual columns, please [open an issue at the repository](https://github.com/Cr4shd3v/crash_orm/issues/new/choose).
pub struct VirtualColumn<T: ColumnType, U: Entity> {
    sql: BoxedSql,
    phantom_1: PhantomData<T>,
    phantom_2: PhantomData<U>,
}

impl<T: ColumnType, U: Entity> VirtualColumn<T, U> {
    /// Creates a virtual column with a [BoxedSql]
    pub fn new(sql: BoxedSql) -> VirtualColumn<T, U> {
        VirtualColumn {
            sql,
            phantom_1: PhantomData,
            phantom_2: PhantomData,
        }
    }

    pub(crate) fn get_sql(&self) -> BoxedSql {
        self.sql.clone()
    }

    /// Constant Column Pi
    pub fn pi() -> VirtualColumn<f64, U> {
        VirtualColumn::new(BoxedSql::new(String::from("PI()"), vec![]))
    }

    /// Generates a random value in the range 0.0 <= x < 1.0
    pub fn random() -> VirtualColumn<f64, U> {
        VirtualColumn::new(BoxedSql::new(String::from("RANDOM()"), vec![]))
    }
}