1use std::str;
2
3use cosmwasm_schema::cw_serde;
4use cosmwasm_std::{Decimal256, Uint256, Uint64};
5
6#[cw_serde]
7pub enum Condition {
8 And(Vec<Box<Condition>>),
9 Or(Vec<Box<Condition>>),
10 Not(Box<Condition>),
11 Expr(Box<Expr>),
12}
13
14#[cw_serde]
15pub struct GenExpr<Type, Op> {
16 pub left: Type,
17 pub op: Op,
18 pub right: Type,
19}
20
21#[cw_serde]
22pub struct TimeExpr {
23 pub comparator: Uint64,
24 pub op: TimeOp, }
26
27#[cw_serde]
28pub struct BlockExpr {
29 pub comparator: Uint64,
30 pub op: NumOp,
31}
32
33#[cw_serde]
34pub enum Value<T> {
35 Simple(T),
36 Ref(String),
37}
38
39#[cw_serde]
40pub enum NumValue<T, ExprOp, FnOp> {
41 Simple(T),
42 Expr(NumExprValue<T, ExprOp, FnOp>),
43 Ref(String),
44 Fn(NumFnValue<T, ExprOp, FnOp>),
45 Env(NumEnvValue),
46}
47
48#[cw_serde]
49pub enum NumEnvValue {
50 Time,
51 BlockHeight,
52}
53
54#[cw_serde]
55pub struct NumExprValue<T, ExprOp, FnOp> {
56 pub left: Box<NumValue<T, ExprOp, FnOp>>,
57 pub op: ExprOp,
58 pub right: Box<NumValue<T, ExprOp, FnOp>>,
59}
60
61#[cw_serde]
62pub struct NumFnValue<T, ExprOp, FnOp> {
63 pub op: FnOp,
64 pub right: Box<NumValue<T, ExprOp, FnOp>>,
65}
66
67#[cw_serde]
68pub enum NumExprOp {
69 Add,
70 Sub,
71 Div,
72 Mul,
73 Mod,
74}
75
76#[cw_serde]
77pub enum DecimalFnOp {
78 Abs,
79 Neg,
80 Floor,
81 Sqrt,
82 Ceil,
83}
84
85#[cw_serde]
86pub enum IntFnOp {
87 Abs,
88 Neg,
89}
90
91#[cw_serde]
92pub enum Expr {
93 String(GenExpr<Value<String>, StringOp>),
94 Uint(GenExpr<NumValue<Uint256, NumExprOp, IntFnOp>, NumOp>),
95 Int(GenExpr<NumValue<i128, NumExprOp, IntFnOp>, NumOp>),
96 Decimal(GenExpr<NumValue<Decimal256, NumExprOp, DecimalFnOp>, NumOp>),
97 Timestamp(TimeExpr),
98 BlockHeight(BlockExpr),
99 Bool(String), }
101
102#[cw_serde]
108pub enum NumOp {
109 Eq,
110 Neq,
111 Lt,
112 Gt,
113 Gte,
114 Lte,
115}
116
117#[cw_serde]
118pub enum TimeOp {
119 Lt,
120 Gt,
121}
122
123#[cw_serde]
124pub enum StringOp {
125 StartsWith,
126 EndsWith,
127 Contains,
128 Eq,
129 Neq,
130}