Skip to main content

axone_logic_bindings/
query.rs

1use crate::error::TermParseError;
2use crate::term_parser::{from_str, TermValue};
3use cosmwasm_std::CustomQuery;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)]
8#[serde(rename_all = "snake_case")]
9pub enum LogicCustomQuery {
10    Ask { program: String, query: String },
11}
12
13impl CustomQuery for LogicCustomQuery {}
14
15#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq, JsonSchema, Debug)]
16#[serde(rename_all = "snake_case")]
17pub struct AskResponse {
18    pub height: u64,
19    pub gas_used: u64,
20    pub answer: Option<Answer>,
21    pub user_output: Option<String>,
22}
23
24#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq, JsonSchema, Debug)]
25#[serde(rename_all = "snake_case")]
26pub struct Answer {
27    pub has_more: bool,
28    pub variables: Vec<String>,
29    pub results: Vec<Result>,
30}
31
32impl Answer {
33    /// Create a new Answer with an error message.
34    pub fn from_error(error: String) -> Self {
35        Self {
36            has_more: false,
37            variables: vec![],
38            results: vec![Result {
39                error: Some(error),
40                substitutions: vec![],
41            }],
42        }
43    }
44}
45
46#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq, JsonSchema, Debug)]
47#[serde(rename_all = "snake_case")]
48pub struct Result {
49    pub error: Option<String>,
50    pub substitutions: Vec<Substitution>,
51}
52
53#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq, JsonSchema, Debug)]
54#[serde(rename_all = "snake_case")]
55pub struct Substitution {
56    pub variable: String,
57    pub expression: String,
58}
59
60impl Substitution {
61    pub fn parse_expression(self) -> std::result::Result<TermValue, TermParseError> {
62        from_str(self.expression.as_str())
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn term_parse() {
72        assert_eq!(
73            Substitution {
74                variable: "X".to_string(),
75                expression: "'hello'".to_string(),
76            }
77            .parse_expression(),
78            Ok(TermValue::Value("hello".to_string()))
79        );
80    }
81}