extern crate alloc;
use alloc::string::String;
use alloc::vec;
use alloc::vec::Vec;
use crate::env;
use crate::error::{Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OracleStatus {
Ready,
Pending,
Expired,
}
#[derive(Debug, Clone)]
pub struct OracleResponse {
pub status: OracleStatus,
pub body: Vec<u8>,
}
pub fn http_call(url: &str, method: &str, body: &[u8]) -> Result<OracleResponse> {
let mut out = vec![0u8; env::MAX_RETURN_DATA_SIZE];
match env::http_call_bytes(url.as_bytes(), method.as_bytes(), body, &mut out) {
Ok(len) => {
out.truncate(len.min(out.len()));
Ok(OracleResponse {
status: OracleStatus::Ready,
body: out,
})
}
Err(err) if err.code() == env::oracle_rc::PENDING => Ok(OracleResponse {
status: OracleStatus::Pending,
body: Vec::new(),
}),
Err(err) if err.code() == env::oracle_rc::EXPIRED => Ok(OracleResponse {
status: OracleStatus::Expired,
body: Vec::new(),
}),
Err(err) => Err(Error::new(err.code())),
}
}
pub fn http_get(url: &str) -> Result<OracleResponse> {
http_call(url, "GET", &[])
}
pub fn http_post(url: &str, body: &[u8]) -> Result<OracleResponse> {
http_call(url, "POST", body)
}
pub fn body_utf8(response: &OracleResponse) -> core::result::Result<String, core::str::Utf8Error> {
let s = core::str::from_utf8(&response.body)?;
Ok(String::from(s))
}