postgrest-parser 0.2.0

PostgREST URL-to-SQL parser for Rust and WASM
Documentation
use super::Field;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Direction {
    Asc,
    Desc,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Nulls {
    First,
    Last,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OrderTerm {
    pub field: Field,
    pub direction: Direction,
    pub nulls: Option<Nulls>,
}

impl OrderTerm {
    pub fn new(field: Field) -> Self {
        Self {
            field,
            direction: Direction::Asc,
            nulls: None,
        }
    }

    pub fn with_direction(mut self, direction: Direction) -> Self {
        self.direction = direction;
        self
    }

    pub fn with_nulls(mut self, nulls: Nulls) -> Self {
        self.nulls = Some(nulls);
        self
    }

    pub fn desc(mut self) -> Self {
        self.direction = Direction::Desc;
        self
    }

    pub fn asc(mut self) -> Self {
        self.direction = Direction::Asc;
        self
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_order_term_new() {
        let field = Field::new("id");
        let term = OrderTerm::new(field);
        assert_eq!(term.direction, Direction::Asc);
        assert!(term.nulls.is_none());
    }

    #[test]
    fn test_order_term_desc() {
        let field = Field::new("created_at");
        let term = OrderTerm::new(field).desc();
        assert_eq!(term.direction, Direction::Desc);
    }

    #[test]
    fn test_order_term_with_nulls() {
        let field = Field::new("name");
        let term = OrderTerm::new(field).with_nulls(Nulls::Last);
        assert_eq!(term.nulls, Some(Nulls::Last));
    }

    #[test]
    fn test_order_term_serialization() {
        let field = Field::new("id");
        let term = OrderTerm::new(field).desc();
        let json = serde_json::to_string(&term).unwrap();
        assert!(json.contains("desc"));
    }
}