mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
Very simplistic http effect
This commit is contained in:
parent
26ff3ebc0e
commit
807988aee6
1 changed files with 50 additions and 24 deletions
|
@ -4,9 +4,10 @@ mod glue;
|
|||
|
||||
use core::alloc::Layout;
|
||||
use core::ffi::c_void;
|
||||
use core::mem::{ManuallyDrop, MaybeUninit};
|
||||
use core::mem::MaybeUninit;
|
||||
use glue::Metadata;
|
||||
use libc;
|
||||
use roc_std::{RocList, RocResult, RocStr};
|
||||
use roc_std::{RocList, RocStr};
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::c_char;
|
||||
use ureq::Error;
|
||||
|
@ -128,36 +129,61 @@ pub extern "C" fn roc_fx_putLine(line: &RocStr) {
|
|||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn roc_fx_send_request(roc_request: &glue::Request, /* should I borrow or not? */) {
|
||||
let (mimetype, body_bytes_slice): (String, Vec<u8>) = match roc_request.body.discriminant() {
|
||||
glue::discriminant_Body::EmptyBody => ("".into(), vec![]),
|
||||
glue::discriminant_Body::Body => {
|
||||
let (mimetype_union, body_roclist) = unsafe { roc_request.body.as_Body() };
|
||||
let mimetype_string: String = unsafe { mimetype_union.as_MimeType() }.as_str().into();
|
||||
let body_bytes: &[u8] = body_roclist.as_slice();
|
||||
(mimetype_string, Vec::from(body_bytes))
|
||||
}
|
||||
};
|
||||
pub extern "C" fn roc_fx_send_request(roc_request: &glue::Request) -> glue::Response {
|
||||
// let (mimetype, body_bytes_slice): (String, Vec<u8>) = match roc_request.body.discriminant() {
|
||||
// glue::discriminant_Body::EmptyBody => ("".into(), vec![]),
|
||||
// glue::discriminant_Body::Body => {
|
||||
// let (mimetype_union, body_roclist) = unsafe { roc_request.body.as_Body() };
|
||||
// let mimetype_string: String = unsafe { mimetype_union.as_MimeType() }.as_str().into();
|
||||
// let body_bytes: &[u8] = body_roclist.as_slice();
|
||||
// (mimetype_string, Vec::from(body_bytes))
|
||||
// }
|
||||
// };
|
||||
|
||||
let url = roc_request.url.as_str();
|
||||
match ureq::get(url).call() {
|
||||
Ok(response) => {
|
||||
let statusCode = response.status();
|
||||
|
||||
let mut buffer: Vec<u8> = vec![];
|
||||
let reader = response.into_reader();
|
||||
reader.read(&mut buffer);
|
||||
}
|
||||
Err(_) => todo!(),
|
||||
}
|
||||
// let rust_body_bytes: Vec<u8> = vec![]; // reqwest something something
|
||||
// let roc_body_bytes = RocList::from_slice(&rust_body_bytes);
|
||||
let mut reader = response.into_reader();
|
||||
reader.read(&mut buffer).expect("can't read response");
|
||||
let body = RocList::from_slice(&buffer);
|
||||
|
||||
// let roc_response: glue::Response = todo!();
|
||||
let metadata = Metadata {
|
||||
headers: RocList::empty(),
|
||||
statusText: RocStr::empty(),
|
||||
url: RocStr::empty(),
|
||||
statusCode,
|
||||
};
|
||||
|
||||
// call_the_closure
|
||||
glue::Response::GoodStatus(metadata, body)
|
||||
}
|
||||
Err(Error::Status(statusCode, response)) => {
|
||||
let mut buffer: Vec<u8> = vec![];
|
||||
let mut reader = response.into_reader();
|
||||
reader.read(&mut buffer).expect("can't read response");
|
||||
let body = RocList::from_slice(&buffer);
|
||||
|
||||
let metadata = Metadata {
|
||||
headers: RocList::empty(),
|
||||
statusText: RocStr::empty(),
|
||||
url: RocStr::empty(),
|
||||
statusCode,
|
||||
};
|
||||
|
||||
glue::Response::BadStatus(metadata, body)
|
||||
}
|
||||
Err(transortError) => {
|
||||
use ureq::ErrorKind::*;
|
||||
match transortError.kind() {
|
||||
InvalidUrl | UnknownScheme => glue::Response::BadUrl(RocStr::from(url)),
|
||||
_ => glue::Response::NetworkError,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
pub enum Error {
|
||||
Status(u16, Response),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue