truthlinked_sdk/
oracle.rs1extern crate alloc;
26
27use alloc::string::String;
28use alloc::vec;
29use alloc::vec::Vec;
30
31use crate::env;
32use crate::error::{Error, Result};
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
36pub enum OracleStatus {
37 Ready,
39 Pending,
41 Expired,
43}
44
45#[derive(Debug, Clone)]
47pub struct OracleResponse {
48 pub status: OracleStatus,
50 pub body: Vec<u8>,
52}
53
54pub fn http_call(url: &str, method: &str, body: &[u8]) -> Result<OracleResponse> {
58 let mut out = vec![0u8; env::MAX_RETURN_DATA_SIZE];
59 match env::http_call_bytes(url.as_bytes(), method.as_bytes(), body, &mut out) {
60 Ok(len) => {
61 out.truncate(len.min(out.len()));
62 Ok(OracleResponse {
63 status: OracleStatus::Ready,
64 body: out,
65 })
66 }
67 Err(err) if err.code() == env::oracle_rc::PENDING => Ok(OracleResponse {
68 status: OracleStatus::Pending,
69 body: Vec::new(),
70 }),
71 Err(err) if err.code() == env::oracle_rc::EXPIRED => Ok(OracleResponse {
72 status: OracleStatus::Expired,
73 body: Vec::new(),
74 }),
75 Err(err) => Err(Error::new(err.code())),
76 }
77}
78
79pub fn http_get(url: &str) -> Result<OracleResponse> {
81 http_call(url, "GET", &[])
82}
83
84pub fn http_post(url: &str, body: &[u8]) -> Result<OracleResponse> {
86 http_call(url, "POST", body)
87}
88
89pub fn body_utf8(response: &OracleResponse) -> core::result::Result<String, core::str::Utf8Error> {
91 let s = core::str::from_utf8(&response.body)?;
92 Ok(String::from(s))
93}