//! State machine phantom types for type-safe query building

use std::marker::PhantomData;

use crate::traits::ClickTable;

/// Marker: Table is bound to the query
pub struct Bound<T: ClickTable>(PhantomData<T>);

/// Marker: No table bound yet
pub struct Unbound;

/// Marker: No aggregation in query
pub struct NoAggregation;

/// Marker: Query contains aggregation functions
pub struct HasAggregation;

/// Marker: Query has GROUP BY clause
pub struct Grouped;

/// Marker: No columns selected
pub struct NoSelection;

/// Marker: Columns are selected
pub struct Selected<Cols>(PhantomData<Cols>);

/// Marker: No WHERE filter
pub struct NoFilter;

/// Marker: Query has WHERE clause
pub struct Filtered;

/// Marker: No ORDER BY
pub struct NoOrder;

/// Marker: Query has ORDER BY clause
pub struct Ordered;

/// Marker: No LIMIT
pub struct NoLimit;

/// Marker: Query has LIMIT clause
pub struct Limited;
