gluesql_core/ast_builder/
order_by_expr_list.rs

1use {
2    super::{ExprNode, OrderByExprNode},
3    crate::{
4        ast::OrderByExpr,
5        parse_sql::parse_order_by_exprs,
6        result::{Error, Result},
7        translate::translate_order_by_expr,
8    },
9};
10
11#[derive(Clone, Debug)]
12pub enum OrderByExprList<'a> {
13    Text(String),
14    OrderByExprs(Vec<OrderByExprNode<'a>>),
15}
16
17impl<'a> From<&str> for OrderByExprList<'a> {
18    fn from(exprs: &str) -> Self {
19        OrderByExprList::Text(exprs.to_owned())
20    }
21}
22
23impl<'a> From<Vec<&str>> for OrderByExprList<'a> {
24    fn from(exprs: Vec<&str>) -> Self {
25        OrderByExprList::OrderByExprs(exprs.into_iter().map(Into::into).collect())
26    }
27}
28
29impl<'a> From<ExprNode<'a>> for OrderByExprList<'a> {
30    fn from(expr_node: ExprNode<'a>) -> Self {
31        OrderByExprList::OrderByExprs(vec![expr_node.into()])
32    }
33}
34
35impl<'a> TryFrom<OrderByExprList<'a>> for Vec<OrderByExpr> {
36    type Error = Error;
37
38    fn try_from(order_by_exprs: OrderByExprList<'a>) -> Result<Self> {
39        match order_by_exprs {
40            OrderByExprList::Text(exprs) => parse_order_by_exprs(exprs)?
41                .iter()
42                .map(translate_order_by_expr)
43                .collect::<Result<Vec<_>>>(),
44            OrderByExprList::OrderByExprs(exprs) => exprs
45                .into_iter()
46                .map(TryInto::try_into)
47                .collect::<Result<Vec<_>>>(),
48        }
49    }
50}