use crate::ast::types::SQLExpression;
use serde::{Deserialize, Serialize};

use super::operators::BinaryOperator;

#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BinaryOperatorExpression {
    pub operator: BinaryOperator,
    pub lhs: SQLExpression,
    pub rhs: SQLExpression,
}

impl From<BinaryOperatorExpression> for SQLExpression {
    fn from(value: BinaryOperatorExpression) -> SQLExpression {
        SQLExpression::Binary(Box::new(value))
    }
}

impl From<Box<BinaryOperatorExpression>> for SQLExpression {
    fn from(value: Box<BinaryOperatorExpression>) -> SQLExpression {
        SQLExpression::Binary(value)
    }
}

impl From<BinaryOperatorExpression> for Option<SQLExpression> {
    fn from(value: BinaryOperatorExpression) -> Option<SQLExpression> {
        Some(SQLExpression::Binary(Box::new(value)))
    }
}

impl From<BinaryOperatorExpression> for Box<SQLExpression> {
    fn from(value: BinaryOperatorExpression) -> Box<SQLExpression> {
        Box::new(SQLExpression::Binary(Box::new(value)))
    }
}

impl From<BinaryOperatorExpression> for Option<Box<SQLExpression>> {
    fn from(value: BinaryOperatorExpression) -> Option<Box<SQLExpression>> {
        Some(Box::new(SQLExpression::Binary(Box::new(value))))
    }
}