gluesql_core/ast_builder/
order_by_expr_list.rs1use {
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}