use core::cmp::Ordering;
use core::hash::Hash;
use rune::alloc::fmt::TryWrite;
use rune::alloc::prelude::*;
use rune::runtime::{Bytes, Formatter, Hasher, Ref, VmResult};
use rune::{docstring, item, Any, ContextError, Module, ToConstValue, Value};
#[rune::module(::http)]
pub fn module(_stdio: bool) -> Result<Module, ContextError> {
let mut module = Module::from_meta(self::module_meta)?;
module.function_meta(get)?;
module.ty::<Client>()?;
module.function_meta(Client::new__meta)?;
module.function_meta(Client::get__meta)?;
module.function_meta(Client::post__meta)?;
module.function_meta(Client::put__meta)?;
module.function_meta(Client::delete__meta)?;
module.function_meta(Client::head__meta)?;
module.ty::<Response>()?;
module.function_meta(Response::text__meta)?;
module.function_meta(Response::json__meta)?;
module.function_meta(Response::bytes__meta)?;
module.function_meta(Response::status__meta)?;
module.function_meta(Response::version__meta)?;
module.function_meta(Response::content_length__meta)?;
module.ty::<RequestBuilder>()?;
module.function_meta(RequestBuilder::send__meta)?;
module.function_meta(RequestBuilder::header__meta)?;
module.function_meta(RequestBuilder::basic_auth__meta)?;
module.function_meta(RequestBuilder::bearer_auth__meta)?;
module.function_meta(RequestBuilder::fetch_mode_no_cors__meta)?;
module.function_meta(RequestBuilder::body_bytes__meta)?;
module.ty::<StatusCode>()?;
module.function_meta(StatusCode::as_u16__meta)?;
module.function_meta(StatusCode::as_str__meta)?;
module.function_meta(StatusCode::canonical_reason__meta)?;
module.function_meta(StatusCode::is_informational__meta)?;
module.function_meta(StatusCode::is_success__meta)?;
module.function_meta(StatusCode::is_redirection__meta)?;
module.function_meta(StatusCode::is_client_error__meta)?;
module.function_meta(StatusCode::is_server_error__meta)?;
module.function_meta(StatusCode::partial_eq__meta)?;
module.implement_trait::<StatusCode>(item!(::std::cmp::PartialEq))?;
module.function_meta(StatusCode::eq__meta)?;
module.implement_trait::<StatusCode>(item!(::std::cmp::Eq))?;
module.function_meta(StatusCode::partial_cmp__meta)?;
module.implement_trait::<StatusCode>(item!(::std::cmp::PartialOrd))?;
module.function_meta(StatusCode::cmp__meta)?;
module.implement_trait::<StatusCode>(item!(::std::cmp::Ord))?;
module.function_meta(StatusCode::hash__meta)?;
module.function_meta(StatusCode::debug_fmt__meta)?;
module.function_meta(StatusCode::display_fmt__meta)?;
module
.constant(
"CONTINUE",
StatusCode {
inner: reqwest::StatusCode::CONTINUE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"SWITCHING_PROTOCOLS",
StatusCode {
inner: reqwest::StatusCode::SWITCHING_PROTOCOLS,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PROCESSING",
StatusCode {
inner: reqwest::StatusCode::PROCESSING,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"OK",
StatusCode {
inner: reqwest::StatusCode::OK,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"CREATED",
StatusCode {
inner: reqwest::StatusCode::CREATED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"ACCEPTED",
StatusCode {
inner: reqwest::StatusCode::ACCEPTED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NON_AUTHORITATIVE_INFORMATION",
StatusCode {
inner: reqwest::StatusCode::NON_AUTHORITATIVE_INFORMATION,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NO_CONTENT",
StatusCode {
inner: reqwest::StatusCode::NO_CONTENT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"RESET_CONTENT",
StatusCode {
inner: reqwest::StatusCode::RESET_CONTENT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PARTIAL_CONTENT",
StatusCode {
inner: reqwest::StatusCode::PARTIAL_CONTENT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"MULTI_STATUS",
StatusCode {
inner: reqwest::StatusCode::MULTI_STATUS,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"ALREADY_REPORTED",
StatusCode {
inner: reqwest::StatusCode::ALREADY_REPORTED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"IM_USED",
StatusCode {
inner: reqwest::StatusCode::IM_USED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"MULTIPLE_CHOICES",
StatusCode {
inner: reqwest::StatusCode::MULTIPLE_CHOICES,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"MOVED_PERMANENTLY",
StatusCode {
inner: reqwest::StatusCode::MOVED_PERMANENTLY,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"FOUND",
StatusCode {
inner: reqwest::StatusCode::FOUND,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"SEE_OTHER",
StatusCode {
inner: reqwest::StatusCode::SEE_OTHER,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NOT_MODIFIED",
StatusCode {
inner: reqwest::StatusCode::NOT_MODIFIED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"USE_PROXY",
StatusCode {
inner: reqwest::StatusCode::USE_PROXY,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"TEMPORARY_REDIRECT",
StatusCode {
inner: reqwest::StatusCode::TEMPORARY_REDIRECT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PERMANENT_REDIRECT",
StatusCode {
inner: reqwest::StatusCode::PERMANENT_REDIRECT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"BAD_REQUEST",
StatusCode {
inner: reqwest::StatusCode::BAD_REQUEST,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"UNAUTHORIZED",
StatusCode {
inner: reqwest::StatusCode::UNAUTHORIZED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PAYMENT_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::PAYMENT_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"FORBIDDEN",
StatusCode {
inner: reqwest::StatusCode::FORBIDDEN,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NOT_FOUND",
StatusCode {
inner: reqwest::StatusCode::NOT_FOUND,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"METHOD_NOT_ALLOWED",
StatusCode {
inner: reqwest::StatusCode::METHOD_NOT_ALLOWED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NOT_ACCEPTABLE",
StatusCode {
inner: reqwest::StatusCode::NOT_ACCEPTABLE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PROXY_AUTHENTICATION_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::PROXY_AUTHENTICATION_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"REQUEST_TIMEOUT",
StatusCode {
inner: reqwest::StatusCode::REQUEST_TIMEOUT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"CONFLICT",
StatusCode {
inner: reqwest::StatusCode::CONFLICT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"GONE",
StatusCode {
inner: reqwest::StatusCode::GONE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"LENGTH_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::LENGTH_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PRECONDITION_FAILED",
StatusCode {
inner: reqwest::StatusCode::PRECONDITION_FAILED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PAYLOAD_TOO_LARGE",
StatusCode {
inner: reqwest::StatusCode::PAYLOAD_TOO_LARGE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"URI_TOO_LONG",
StatusCode {
inner: reqwest::StatusCode::URI_TOO_LONG,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"UNSUPPORTED_MEDIA_TYPE",
StatusCode {
inner: reqwest::StatusCode::UNSUPPORTED_MEDIA_TYPE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"RANGE_NOT_SATISFIABLE",
StatusCode {
inner: reqwest::StatusCode::RANGE_NOT_SATISFIABLE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"EXPECTATION_FAILED",
StatusCode {
inner: reqwest::StatusCode::EXPECTATION_FAILED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"IM_A_TEAPOT",
StatusCode {
inner: reqwest::StatusCode::IM_A_TEAPOT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"MISDIRECTED_REQUEST",
StatusCode {
inner: reqwest::StatusCode::MISDIRECTED_REQUEST,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"UNPROCESSABLE_ENTITY",
StatusCode {
inner: reqwest::StatusCode::UNPROCESSABLE_ENTITY,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"LOCKED",
StatusCode {
inner: reqwest::StatusCode::LOCKED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"FAILED_DEPENDENCY",
StatusCode {
inner: reqwest::StatusCode::FAILED_DEPENDENCY,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"UPGRADE_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::UPGRADE_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"PRECONDITION_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::PRECONDITION_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"TOO_MANY_REQUESTS",
StatusCode {
inner: reqwest::StatusCode::TOO_MANY_REQUESTS,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"REQUEST_HEADER_FIELDS_TOO_LARGE",
StatusCode {
inner: reqwest::StatusCode::REQUEST_HEADER_FIELDS_TOO_LARGE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"UNAVAILABLE_FOR_LEGAL_REASONS",
StatusCode {
inner: reqwest::StatusCode::UNAVAILABLE_FOR_LEGAL_REASONS,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"INTERNAL_SERVER_ERROR",
StatusCode {
inner: reqwest::StatusCode::INTERNAL_SERVER_ERROR,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NOT_IMPLEMENTED",
StatusCode {
inner: reqwest::StatusCode::NOT_IMPLEMENTED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"BAD_GATEWAY",
StatusCode {
inner: reqwest::StatusCode::BAD_GATEWAY,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"SERVICE_UNAVAILABLE",
StatusCode {
inner: reqwest::StatusCode::SERVICE_UNAVAILABLE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"GATEWAY_TIMEOUT",
StatusCode {
inner: reqwest::StatusCode::GATEWAY_TIMEOUT,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"HTTP_VERSION_NOT_SUPPORTED",
StatusCode {
inner: reqwest::StatusCode::HTTP_VERSION_NOT_SUPPORTED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"VARIANT_ALSO_NEGOTIATES",
StatusCode {
inner: reqwest::StatusCode::VARIANT_ALSO_NEGOTIATES,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"INSUFFICIENT_STORAGE",
StatusCode {
inner: reqwest::StatusCode::INSUFFICIENT_STORAGE,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"LOOP_DETECTED",
StatusCode {
inner: reqwest::StatusCode::LOOP_DETECTED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NOT_EXTENDED",
StatusCode {
inner: reqwest::StatusCode::NOT_EXTENDED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module
.constant(
"NETWORK_AUTHENTICATION_REQUIRED",
StatusCode {
inner: reqwest::StatusCode::NETWORK_AUTHENTICATION_REQUIRED,
},
)
.build_associated::<StatusCode>()?
.docs(docstring! {
})?;
module.ty::<Version>()?;
module.function_meta(Version::partial_eq__meta)?;
module.implement_trait::<Version>(item!(::std::cmp::PartialEq))?;
module.function_meta(Version::eq__meta)?;
module.implement_trait::<Version>(item!(::std::cmp::Eq))?;
module.function_meta(Version::partial_cmp__meta)?;
module.implement_trait::<Version>(item!(::std::cmp::PartialOrd))?;
module.function_meta(Version::cmp__meta)?;
module.implement_trait::<Version>(item!(::std::cmp::Ord))?;
module.function_meta(Version::hash__meta)?;
module.function_meta(Version::debug_fmt__meta)?;
module
.constant(
"HTTP_09",
Version {
inner: reqwest::Version::HTTP_09,
},
)
.build_associated::<Version>()?
.docs(docstring! {
})?;
module
.constant(
"HTTP_10",
Version {
inner: reqwest::Version::HTTP_10,
},
)
.build_associated::<Version>()?
.docs(docstring! {
})?;
module
.constant(
"HTTP_11",
Version {
inner: reqwest::Version::HTTP_11,
},
)
.build_associated::<Version>()?
.docs(docstring! {
})?;
module
.constant(
"HTTP_2",
Version {
inner: reqwest::Version::HTTP_2,
},
)
.build_associated::<Version>()?
.docs(docstring! {
})?;
module
.constant(
"HTTP_3",
Version {
inner: reqwest::Version::HTTP_3,
},
)
.build_associated::<Version>()?
.docs(docstring! {
})?;
module.ty::<Error>()?;
module.function_meta(Error::display_fmt__meta)?;
Ok(module)
}
#[derive(Debug, Any)]
#[rune(item = ::http)]
pub struct Error {
inner: reqwest::Error,
}
impl From<reqwest::Error> for Error {
fn from(inner: reqwest::Error) -> Self {
Self { inner }
}
}
impl Error {
#[rune::function(keep, instance, protocol = DISPLAY_FMT)]
fn display_fmt(&self, f: &mut Formatter) -> VmResult<()> {
rune::vm_write!(f, "{}", self.inner)
}
}
#[derive(Debug, Any)]
#[rune(item = ::http)]
struct Client {
client: reqwest::Client,
}
#[derive(Debug, Any)]
#[rune(item = ::http)]
pub struct Response {
response: reqwest::Response,
}
impl Response {
#[rune::function(keep, vm_result)]
async fn text(self) -> Result<String, Error> {
let text = self.response.text().await?;
Ok(String::try_from(text).vm?)
}
#[rune::function(keep)]
async fn json(self) -> Result<Value, Error> {
let text = self.response.json().await?;
Ok(text)
}
#[rune::function(keep, vm_result)]
async fn bytes(mut self) -> Result<Bytes, Error> {
let len = self.response.content_length().unwrap_or(0) as usize;
let mut bytes = Vec::try_with_capacity(len).vm?;
while let Some(chunk) = self.response.chunk().await? {
bytes.try_extend_from_slice(chunk.as_ref()).vm?;
}
Ok(Bytes::from_vec(bytes))
}
#[rune::function(keep, instance)]
fn status(&self) -> StatusCode {
StatusCode {
inner: self.response.status(),
}
}
#[rune::function(keep, instance)]
fn version(&self) -> Version {
Version {
inner: self.response.version(),
}
}
#[rune::function(keep, instance)]
fn content_length(&self) -> Option<u64> {
self.response.content_length()
}
}
#[derive(Debug, Any, PartialEq, Eq, PartialOrd, Ord, ToConstValue)]
#[rune(item = ::http)]
pub struct StatusCode {
#[const_value(with = self::const_status_code)]
inner: reqwest::StatusCode,
}
impl StatusCode {
#[rune::function(keep, instance)]
#[inline]
fn as_u16(&self) -> u16 {
self.inner.as_u16()
}
#[rune::function(keep, instance, vm_result)]
#[inline]
fn as_str(&self) -> String {
self.inner.as_str().try_to_owned().vm?
}
#[inline]
#[rune::function(keep, instance)]
fn canonical_reason(&self) -> Option<&'static str> {
self.inner.canonical_reason()
}
#[inline]
#[rune::function(keep, instance)]
fn is_informational(&self) -> bool {
self.inner.is_informational()
}
#[inline]
#[rune::function(keep, instance)]
fn is_success(&self) -> bool {
self.inner.is_success()
}
#[inline]
#[rune::function(keep, instance)]
fn is_redirection(&self) -> bool {
self.inner.is_redirection()
}
#[inline]
#[rune::function(keep, instance)]
fn is_client_error(&self) -> bool {
self.inner.is_client_error()
}
#[inline]
#[rune::function(keep, instance)]
fn is_server_error(&self) -> bool {
self.inner.is_server_error()
}
#[rune::function(keep, instance, protocol = PARTIAL_EQ)]
#[inline]
fn partial_eq(&self, rhs: &Self) -> bool {
PartialEq::eq(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = EQ)]
#[inline]
fn eq(&self, rhs: &Self) -> bool {
PartialEq::eq(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = PARTIAL_CMP)]
#[inline]
fn partial_cmp(&self, rhs: &Self) -> Option<Ordering> {
PartialOrd::partial_cmp(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = CMP)]
#[inline]
fn cmp(&self, rhs: &Self) -> Ordering {
Ord::cmp(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = HASH)]
fn hash(&self, hasher: &mut Hasher) {
self.inner.hash(hasher);
}
#[rune::function(keep, instance, protocol = DEBUG_FMT)]
fn debug_fmt(&self, f: &mut Formatter) -> VmResult<()> {
rune::vm_write!(f, "{:?}", self.inner)
}
#[rune::function(keep, instance, protocol = DISPLAY_FMT)]
fn display_fmt(&self, f: &mut Formatter) -> VmResult<()> {
rune::vm_write!(f, "{}", self.inner)
}
}
#[derive(Debug, Any, PartialEq, Eq, PartialOrd, Ord, ToConstValue)]
#[rune(item = ::http)]
pub struct Version {
#[const_value(with = self::const_version)]
inner: reqwest::Version,
}
impl Version {
#[rune::function(keep, instance, protocol = PARTIAL_EQ)]
#[inline]
fn partial_eq(&self, rhs: &Self) -> bool {
PartialEq::eq(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = EQ)]
#[inline]
fn eq(&self, rhs: &Self) -> bool {
PartialEq::eq(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = PARTIAL_CMP)]
#[inline]
fn partial_cmp(&self, rhs: &Self) -> Option<Ordering> {
PartialOrd::partial_cmp(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = CMP)]
#[inline]
fn cmp(&self, rhs: &Self) -> Ordering {
Ord::cmp(&self.inner, &rhs.inner)
}
#[rune::function(keep, instance, protocol = HASH)]
fn hash(&self, hasher: &mut Hasher) {
self.inner.hash(hasher);
}
#[rune::function(keep, instance, protocol = DEBUG_FMT)]
fn debug_fmt(&self, f: &mut Formatter) -> VmResult<()> {
rune::vm_write!(f, "{:?}", self.inner)
}
}
#[derive(Debug, Any)]
#[rune(item = ::http)]
pub struct RequestBuilder {
request: reqwest::RequestBuilder,
}
impl RequestBuilder {
#[rune::function(keep)]
async fn send(self) -> Result<Response, Error> {
let response = self.request.send().await?;
Ok(Response { response })
}
#[rune::function(keep)]
fn header(self, key: &str, value: &str) -> Self {
Self {
request: self.request.header(key, value),
}
}
#[rune::function(keep)]
fn basic_auth(self, username: &str, password: Option<Ref<str>>) -> Self {
Self {
request: self.request.basic_auth(username, password.as_deref()),
}
}
#[rune::function(keep)]
fn bearer_auth(self, token: &str) -> Self {
Self {
request: self.request.bearer_auth(token),
}
}
#[rune::function]
fn version(self, version: Version) -> Self {
Self {
request: self.request.version(version.inner),
}
}
#[rune::function(keep)]
fn fetch_mode_no_cors(self) -> Self {
Self {
request: self.request.fetch_mode_no_cors(),
}
}
#[rune::function(keep)]
fn body_bytes(self, bytes: Bytes) -> Self {
let bytes = bytes.into_vec();
Self {
request: self.request.body(bytes.into_std()),
}
}
}
impl Client {
#[rune::function(keep, path = Self::new)]
fn new() -> Self {
Self {
client: reqwest::Client::new(),
}
}
#[rune::function(keep, instance)]
fn get(&self, url: &str) -> RequestBuilder {
RequestBuilder {
request: self.client.get(url),
}
}
#[rune::function(keep, instance)]
fn post(&self, url: &str) -> RequestBuilder {
let request = self.client.post(url);
RequestBuilder { request }
}
#[rune::function(keep, instance)]
fn put(&self, url: &str) -> RequestBuilder {
let request = self.client.put(url);
RequestBuilder { request }
}
#[rune::function(instance)]
fn patch(&self, url: &str) -> RequestBuilder {
let request = self.client.patch(url);
RequestBuilder { request }
}
#[rune::function(keep, instance)]
fn delete(&self, url: &str) -> RequestBuilder {
let request = self.client.delete(url);
RequestBuilder { request }
}
#[rune::function(keep, instance)]
fn head(&self, url: &str) -> RequestBuilder {
let request = self.client.head(url);
RequestBuilder { request }
}
}
#[rune::function]
async fn get(url: Ref<str>) -> Result<Response, Error> {
Ok(Response {
response: reqwest::get(url.as_ref()).await?,
})
}
mod const_version {
use rune::runtime::{ConstValue, RuntimeError, Value};
#[inline]
pub(super) fn to_const_value(version: reqwest::Version) -> Result<ConstValue, RuntimeError> {
match version {
reqwest::Version::HTTP_09 => Ok(ConstValue::from(1i64)),
reqwest::Version::HTTP_10 => Ok(ConstValue::from(2i64)),
reqwest::Version::HTTP_11 => Ok(ConstValue::from(3i64)),
reqwest::Version::HTTP_2 => Ok(ConstValue::from(4i64)),
reqwest::Version::HTTP_3 => Ok(ConstValue::from(5i64)),
version => Err(RuntimeError::panic(format!(
"Unsupported reqwest version {version:?}"
))),
}
}
#[inline]
pub(super) fn from_const_value(version: &ConstValue) -> Result<reqwest::Version, RuntimeError> {
from_i64(rune::from_const_value(version)?)
}
#[inline]
pub(super) fn from_value(version: Value) -> Result<reqwest::Version, RuntimeError> {
from_i64(rune::from_value(version)?)
}
#[inline]
fn from_i64(value: i64) -> Result<reqwest::Version, RuntimeError> {
match value {
1i64 => Ok(reqwest::Version::HTTP_09),
2i64 => Ok(reqwest::Version::HTTP_10),
3i64 => Ok(reqwest::Version::HTTP_11),
4i64 => Ok(reqwest::Version::HTTP_2),
5i64 => Ok(reqwest::Version::HTTP_3),
value => Err(RuntimeError::panic(format!(
"unsupported reqwest version {value}"
))),
}
}
}
mod const_status_code {
use rune::runtime::{ConstValue, RuntimeError, Value};
#[inline]
pub(super) fn to_const_value(status: reqwest::StatusCode) -> Result<ConstValue, RuntimeError> {
Ok(ConstValue::from(status.as_u16()))
}
#[inline]
pub(super) fn from_const_value(
status: &ConstValue,
) -> Result<reqwest::StatusCode, RuntimeError> {
match reqwest::StatusCode::from_u16(rune::from_const_value(status)?) {
Ok(status) => Ok(status),
Err(error) => Err(RuntimeError::panic(error)),
}
}
#[inline]
pub(super) fn from_value(value: Value) -> Result<reqwest::StatusCode, RuntimeError> {
match reqwest::StatusCode::from_u16(rune::from_value(value)?) {
Ok(status) => Ok(status),
Err(error) => Err(RuntimeError::panic(error)),
}
}
}