axone_logic_bindings/
query.rs1use 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 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}