Very simplistic http effect

This commit is contained in:
Brian Carroll 2022-07-14 21:32:10 +01:00
parent 26ff3ebc0e
commit 807988aee6
No known key found for this signature in database
GPG key ID: 9CF4E3BF9C4722C7

View file

@ -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),