diff --git a/crates/discord/src/bindings.rs b/crates/discord/src/bindings.rs index 476d9b3..716bbc1 100644 --- a/crates/discord/src/bindings.rs +++ b/crates/discord/src/bindings.rs @@ -75,8 +75,7 @@ pub unsafe fn _export_create_webhook_cabi( arg4: *mut u8, arg5: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -89,62 +88,40 @@ pub unsafe fn _export_create_webhook_cabi( _rt::string_lift(bytes2), ); let ptr4 = (&raw mut _RET_AREA.0).cast::(); - let Webhook { - id: id5, - token: token5, - url: url5, - } = result3; + let Webhook { id: id5, token: token5, url: url5 } = result3; let vec6 = (id5.into_bytes()).into_boxed_slice(); let ptr6 = vec6.as_ptr().cast::(); let len6 = vec6.len(); ::core::mem::forget(vec6); - *ptr4 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len6; + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = len6; *ptr4.add(0).cast::<*mut u8>() = ptr6.cast_mut(); let vec7 = (token5.into_bytes()).into_boxed_slice(); let ptr7 = vec7.as_ptr().cast::(); let len7 = vec7.len(); ::core::mem::forget(vec7); - *ptr4 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len7; - *ptr4 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr7.cast_mut(); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len7; + *ptr4.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr7 + .cast_mut(); let vec8 = (url5.into_bytes()).into_boxed_slice(); let ptr8 = vec8.as_ptr().cast::(); let len8 = vec8.len(); ::core::mem::forget(vec8); - *ptr4 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = len8; - *ptr4 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr8.cast_mut(); + *ptr4.add(5 * ::core::mem::size_of::<*const u8>()).cast::() = len8; + *ptr4.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr8 + .cast_mut(); ptr4 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_create_webhook(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); - let l4 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l5 = *arg0 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l4 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l5 = *arg0.add(5 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l4, l5, 1); } #[doc(hidden)] @@ -157,8 +134,7 @@ pub unsafe fn _export_delete_webhook_cabi( arg4: *mut u8, arg5: usize, ) -> i32 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -185,8 +161,7 @@ pub unsafe fn _export_delete_message_cabi( arg4: *mut u8, arg5: usize, ) -> i32 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -215,8 +190,7 @@ pub unsafe fn _export_edit_message_cabi( arg6: *mut u8, arg7: usize, ) -> i32 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -244,61 +218,43 @@ pub unsafe fn _export_get_channel_cabi( arg2: *mut u8, arg3: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; let bytes1 = _rt::Vec::from_raw_parts(arg2.cast(), len1, len1); let result2 = T::get_channel(_rt::string_lift(bytes0), _rt::string_lift(bytes1)); let ptr3 = (&raw mut _RET_AREA.0).cast::(); - let Channel { - id: id4, - name: name4, - ty: ty4, - guild_id: guild_id4, - } = result2; + let Channel { id: id4, name: name4, ty: ty4, guild_id: guild_id4 } = result2; let vec5 = (id4.into_bytes()).into_boxed_slice(); let ptr5 = vec5.as_ptr().cast::(); let len5 = vec5.len(); ::core::mem::forget(vec5); - *ptr3 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len5; + *ptr3.add(::core::mem::size_of::<*const u8>()).cast::() = len5; *ptr3.add(0).cast::<*mut u8>() = ptr5.cast_mut(); let vec6 = (name4.into_bytes()).into_boxed_slice(); let ptr6 = vec6.as_ptr().cast::(); let len6 = vec6.len(); ::core::mem::forget(vec6); - *ptr3 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len6; - *ptr3 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr6.cast_mut(); - *ptr3 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::() = _rt::as_i32(ty4); + *ptr3.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len6; + *ptr3.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr6 + .cast_mut(); + *ptr3.add(4 * ::core::mem::size_of::<*const u8>()).cast::() = _rt::as_i32(ty4); match guild_id4 { Some(e) => { - *ptr3 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = (1i32) as u8; + *ptr3.add(5 * ::core::mem::size_of::<*const u8>()).cast::() = (1i32) + as u8; let vec7 = (e.into_bytes()).into_boxed_slice(); let ptr7 = vec7.as_ptr().cast::(); let len7 = vec7.len(); ::core::mem::forget(vec7); - *ptr3 - .add(7 * ::core::mem::size_of::<*const u8>()) - .cast::() = len7; - *ptr3 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr7.cast_mut(); + *ptr3.add(7 * ::core::mem::size_of::<*const u8>()).cast::() = len7; + *ptr3.add(6 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr7 + .cast_mut(); } None => { - *ptr3 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = (0i32) as u8; + *ptr3.add(5 * ::core::mem::size_of::<*const u8>()).cast::() = (0i32) + as u8; } }; ptr3 @@ -307,31 +263,19 @@ pub unsafe fn _export_get_channel_cabi( #[allow(non_snake_case)] pub unsafe fn __post_return_get_channel(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); - let l4 = i32::from( - *arg0 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::(), - ); + let l4 = i32::from(*arg0.add(5 * ::core::mem::size_of::<*const u8>()).cast::()); match l4 { 0 => {} _ => { let l5 = *arg0 .add(6 * ::core::mem::size_of::<*const u8>()) .cast::<*mut u8>(); - let l6 = *arg0 - .add(7 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l6 = *arg0.add(7 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l5, l6, 1); } } @@ -344,8 +288,7 @@ pub unsafe fn _export_get_user_cabi( arg2: *mut u8, arg3: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -362,50 +305,37 @@ pub unsafe fn _export_get_user_cabi( let ptr5 = vec5.as_ptr().cast::(); let len5 = vec5.len(); ::core::mem::forget(vec5); - *ptr3 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len5; + *ptr3.add(::core::mem::size_of::<*const u8>()).cast::() = len5; *ptr3.add(0).cast::<*mut u8>() = ptr5.cast_mut(); let vec6 = (username4.into_bytes()).into_boxed_slice(); let ptr6 = vec6.as_ptr().cast::(); let len6 = vec6.len(); ::core::mem::forget(vec6); - *ptr3 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len6; - *ptr3 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr6.cast_mut(); + *ptr3.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len6; + *ptr3.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr6 + .cast_mut(); let vec7 = (discriminator4.into_bytes()).into_boxed_slice(); let ptr7 = vec7.as_ptr().cast::(); let len7 = vec7.len(); ::core::mem::forget(vec7); - *ptr3 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = len7; - *ptr3 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr7.cast_mut(); + *ptr3.add(5 * ::core::mem::size_of::<*const u8>()).cast::() = len7; + *ptr3.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr7 + .cast_mut(); match avatar4 { Some(e) => { - *ptr3 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::() = (1i32) as u8; + *ptr3.add(6 * ::core::mem::size_of::<*const u8>()).cast::() = (1i32) + as u8; let vec8 = (e.into_bytes()).into_boxed_slice(); let ptr8 = vec8.as_ptr().cast::(); let len8 = vec8.len(); ::core::mem::forget(vec8); - *ptr3 - .add(8 * ::core::mem::size_of::<*const u8>()) - .cast::() = len8; - *ptr3 - .add(7 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr8.cast_mut(); + *ptr3.add(8 * ::core::mem::size_of::<*const u8>()).cast::() = len8; + *ptr3.add(7 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr8 + .cast_mut(); } None => { - *ptr3 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::() = (0i32) as u8; + *ptr3.add(6 * ::core::mem::size_of::<*const u8>()).cast::() = (0i32) + as u8; } }; ptr3 @@ -414,38 +344,22 @@ pub unsafe fn _export_get_user_cabi( #[allow(non_snake_case)] pub unsafe fn __post_return_get_user(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); - let l4 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l5 = *arg0 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l4 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l5 = *arg0.add(5 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l4, l5, 1); - let l6 = i32::from( - *arg0 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::(), - ); + let l6 = i32::from(*arg0.add(6 * ::core::mem::size_of::<*const u8>()).cast::()); match l6 { 0 => {} _ => { let l7 = *arg0 .add(7 * ::core::mem::size_of::<*const u8>()) .cast::<*mut u8>(); - let l8 = *arg0 - .add(8 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l8 = *arg0.add(8 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l7, l8, 1); } } @@ -463,8 +377,7 @@ pub unsafe fn _export_send_message_cabi( arg7: *mut u8, arg8: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -495,9 +408,7 @@ pub unsafe fn _export_send_message_cabi( let ptr6 = vec6.as_ptr().cast::(); let len6 = vec6.len(); ::core::mem::forget(vec6); - *ptr5 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len6; + *ptr5.add(::core::mem::size_of::<*const u8>()).cast::() = len6; *ptr5.add(0).cast::<*mut u8>() = ptr6.cast_mut(); ptr5 } @@ -505,9 +416,7 @@ pub unsafe fn _export_send_message_cabi( #[allow(non_snake_case)] pub unsafe fn __post_return_send_message(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); } #[doc(hidden)] @@ -524,8 +433,7 @@ pub unsafe fn _export_send_webhook_message_cabi( arg8: *mut u8, arg9: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -550,9 +458,7 @@ pub unsafe fn _export_send_webhook_message_cabi( let ptr7 = vec7.as_ptr().cast::(); let len7 = vec7.len(); ::core::mem::forget(vec7); - *ptr6 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len7; + *ptr6.add(::core::mem::size_of::<*const u8>()).cast::() = len7; *ptr6.add(0).cast::<*mut u8>() = ptr7.cast_mut(); ptr6 } @@ -560,20 +466,25 @@ pub unsafe fn _export_send_webhook_message_cabi( #[allow(non_snake_case)] pub unsafe fn __post_return_send_webhook_message(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); } pub trait Guest { - fn create_webhook(token: _rt::String, channel_id: _rt::String, name: _rt::String) -> Webhook; + fn create_webhook( + token: _rt::String, + channel_id: _rt::String, + name: _rt::String, + ) -> Webhook; fn delete_webhook( token: _rt::String, webhook_id: _rt::String, webhook_token: _rt::String, ) -> bool; - fn delete_message(token: _rt::String, channel_id: _rt::String, message_id: _rt::String) - -> bool; + fn delete_message( + token: _rt::String, + channel_id: _rt::String, + message_id: _rt::String, + ) -> bool; fn edit_message( token: _rt::String, channel_id: _rt::String, @@ -645,8 +556,9 @@ pub(crate) use __export_world_discord_cabi; #[cfg_attr(target_pointer_width = "64", repr(align(8)))] #[cfg_attr(target_pointer_width = "32", repr(align(4)))] struct _RetArea([::core::mem::MaybeUninit; 9 * ::core::mem::size_of::<*const u8>()]); -static mut _RET_AREA: _RetArea = - _RetArea([::core::mem::MaybeUninit::uninit(); 9 * ::core::mem::size_of::<*const u8>()]); +static mut _RET_AREA: _RetArea = _RetArea( + [::core::mem::MaybeUninit::uninit(); 9 * ::core::mem::size_of::<*const u8>()], +); #[rustfmt::skip] mod _rt { #![allow(dead_code, clippy::all)] @@ -769,7 +681,9 @@ macro_rules! __export_discord_impl { #[doc(inline)] pub(crate) use __export_discord_impl as export; #[cfg(target_arch = "wasm32")] -#[unsafe(link_section = "component-type:wit-bindgen:0.41.0:wassemble:discord@0.1.0:discord:encoded world")] +#[unsafe( + link_section = "component-type:wit-bindgen:0.41.0:wassemble:discord@0.1.0:discord:encoded world" +)] #[doc(hidden)] #[allow(clippy::octal_escapes)] pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 731] = *b"\ diff --git a/crates/github/src/bindings.rs b/crates/github/src/bindings.rs index 21aa817..c78693a 100644 --- a/crates/github/src/bindings.rs +++ b/crates/github/src/bindings.rs @@ -18,8 +18,7 @@ pub unsafe fn _export_create_issue_cabi( arg8: *mut u8, arg9: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -47,39 +46,28 @@ pub unsafe fn _export_create_issue_cabi( let ptr8 = vec8.as_ptr().cast::(); let len8 = vec8.len(); ::core::mem::forget(vec8); - *ptr6 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len8; + *ptr6.add(::core::mem::size_of::<*const u8>()).cast::() = len8; *ptr6.add(0).cast::<*mut u8>() = ptr8.cast_mut(); - *ptr6 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::() = _rt::as_i32(number7); + *ptr6.add(2 * ::core::mem::size_of::<*const u8>()).cast::() = _rt::as_i32( + number7, + ); let vec9 = (title7.into_bytes()).into_boxed_slice(); let ptr9 = vec9.as_ptr().cast::(); let len9 = vec9.len(); ::core::mem::forget(vec9); - *ptr6 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::() = len9; - *ptr6 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr9.cast_mut(); + *ptr6.add(4 * ::core::mem::size_of::<*const u8>()).cast::() = len9; + *ptr6.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr9 + .cast_mut(); ptr6 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_create_issue(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); } #[doc(hidden)] @@ -92,8 +80,7 @@ pub unsafe fn _export_create_repository_cabi( arg4: *mut u8, arg5: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -115,53 +102,35 @@ pub unsafe fn _export_create_repository_cabi( let ptr6 = vec6.as_ptr().cast::(); let len6 = vec6.len(); ::core::mem::forget(vec6); - *ptr4 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len6; + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = len6; *ptr4.add(0).cast::<*mut u8>() = ptr6.cast_mut(); let vec7 = (owner5.into_bytes()).into_boxed_slice(); let ptr7 = vec7.as_ptr().cast::(); let len7 = vec7.len(); ::core::mem::forget(vec7); - *ptr4 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len7; - *ptr4 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr7.cast_mut(); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len7; + *ptr4.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr7 + .cast_mut(); let vec8 = (description5.into_bytes()).into_boxed_slice(); let ptr8 = vec8.as_ptr().cast::(); let len8 = vec8.len(); ::core::mem::forget(vec8); - *ptr4 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = len8; - *ptr4 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr8.cast_mut(); + *ptr4.add(5 * ::core::mem::size_of::<*const u8>()).cast::() = len8; + *ptr4.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr8 + .cast_mut(); ptr4 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_create_repository(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); - let l4 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l5 = *arg0 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l4 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l5 = *arg0.add(5 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l4, l5, 1); } #[doc(hidden)] @@ -174,8 +143,7 @@ pub unsafe fn _export_delete_repository_cabi( arg4: *mut u8, arg5: usize, ) -> i32 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -195,8 +163,7 @@ pub unsafe fn _export_delete_repository_cabi( #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn _export_get_user_cabi(arg0: *mut u8, arg1: usize) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let result1 = T::get_user(_rt::string_lift(bytes0)); @@ -210,39 +177,26 @@ pub unsafe fn _export_get_user_cabi(arg0: *mut u8, arg1: usize) -> *mu let ptr4 = vec4.as_ptr().cast::(); let len4 = vec4.len(); ::core::mem::forget(vec4); - *ptr2 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len4; + *ptr2.add(::core::mem::size_of::<*const u8>()).cast::() = len4; *ptr2.add(0).cast::<*mut u8>() = ptr4.cast_mut(); - *ptr2 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::() = _rt::as_i64(id3); + *ptr2.add(2 * ::core::mem::size_of::<*const u8>()).cast::() = _rt::as_i64(id3); let vec5 = (avatar_url3.into_bytes()).into_boxed_slice(); let ptr5 = vec5.as_ptr().cast::(); let len5 = vec5.len(); ::core::mem::forget(vec5); - *ptr2 - .add(8 + 3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len5; - *ptr2 - .add(8 + 2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr5.cast_mut(); + *ptr2.add(8 + 3 * ::core::mem::size_of::<*const u8>()).cast::() = len5; + *ptr2.add(8 + 2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr5 + .cast_mut(); ptr2 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_get_user(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(8 + 2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(8 + 3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(8 + 2 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(8 + 3 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); } #[doc(hidden)] @@ -260,8 +214,7 @@ pub unsafe fn _export_update_issue_cabi( arg9: *mut u8, arg10: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -290,39 +243,28 @@ pub unsafe fn _export_update_issue_cabi( let ptr8 = vec8.as_ptr().cast::(); let len8 = vec8.len(); ::core::mem::forget(vec8); - *ptr6 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len8; + *ptr6.add(::core::mem::size_of::<*const u8>()).cast::() = len8; *ptr6.add(0).cast::<*mut u8>() = ptr8.cast_mut(); - *ptr6 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::() = _rt::as_i32(number7); + *ptr6.add(2 * ::core::mem::size_of::<*const u8>()).cast::() = _rt::as_i32( + number7, + ); let vec9 = (title7.into_bytes()).into_boxed_slice(); let ptr9 = vec9.as_ptr().cast::(); let len9 = vec9.len(); ::core::mem::forget(vec9); - *ptr6 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::() = len9; - *ptr6 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr9.cast_mut(); + *ptr6.add(4 * ::core::mem::size_of::<*const u8>()).cast::() = len9; + *ptr6.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr9 + .cast_mut(); ptr6 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_update_issue(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l2 = *arg0.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l3 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l2, l3, 1); } pub trait Guest { @@ -338,7 +280,11 @@ pub trait Guest { name: _rt::String, description: _rt::String, ) -> Repository; - fn delete_repository(token: _rt::String, owner: _rt::String, repo: _rt::String) -> bool; + fn delete_repository( + token: _rt::String, + owner: _rt::String, + repo: _rt::String, + ) -> bool; fn get_user(token: _rt::String) -> User; fn update_issue( token: _rt::String, @@ -390,8 +336,9 @@ macro_rules! __export_world_github_cabi { pub(crate) use __export_world_github_cabi; #[repr(align(8))] struct _RetArea([::core::mem::MaybeUninit; 6 * ::core::mem::size_of::<*const u8>()]); -static mut _RET_AREA: _RetArea = - _RetArea([::core::mem::MaybeUninit::uninit(); 6 * ::core::mem::size_of::<*const u8>()]); +static mut _RET_AREA: _RetArea = _RetArea( + [::core::mem::MaybeUninit::uninit(); 6 * ::core::mem::size_of::<*const u8>()], +); #[rustfmt::skip] #[allow(dead_code, clippy::all)] pub mod wassemble { @@ -597,7 +544,9 @@ macro_rules! __export_github_impl { #[doc(inline)] pub(crate) use __export_github_impl as export; #[cfg(target_arch = "wasm32")] -#[unsafe(link_section = "component-type:wit-bindgen:0.41.0:wassemble:github@0.1.0:github:encoded world")] +#[unsafe( + link_section = "component-type:wit-bindgen:0.41.0:wassemble:github@0.1.0:github:encoded world" +)] #[doc(hidden)] #[allow(clippy::octal_escapes)] pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 631] = *b"\ diff --git a/crates/hello-world/src/bindings.rs b/crates/hello-world/src/bindings.rs index 5ceca20..1f1ae83 100644 --- a/crates/hello-world/src/bindings.rs +++ b/crates/hello-world/src/bindings.rs @@ -4,17 +4,14 @@ #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn _export_hello_world_cabi() -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let result0 = T::hello_world(); let ptr1 = (&raw mut _RET_AREA.0).cast::(); let vec2 = (result0.into_bytes()).into_boxed_slice(); let ptr2 = vec2.as_ptr().cast::(); let len2 = vec2.len(); ::core::mem::forget(vec2); - *ptr1 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len2; + *ptr1.add(::core::mem::size_of::<*const u8>()).cast::() = len2; *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); ptr1 } @@ -22,9 +19,7 @@ pub unsafe fn _export_hello_world_cabi() -> *mut u8 { #[allow(non_snake_case)] pub unsafe fn __post_return_hello_world(arg0: *mut u8) { let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::(); _rt::cabi_dealloc(l0, l1, 1); } pub trait Guest { @@ -46,8 +41,9 @@ pub(crate) use __export_world_hello_world_cabi; #[cfg_attr(target_pointer_width = "64", repr(align(8)))] #[cfg_attr(target_pointer_width = "32", repr(align(4)))] struct _RetArea([::core::mem::MaybeUninit; 2 * ::core::mem::size_of::<*const u8>()]); -static mut _RET_AREA: _RetArea = - _RetArea([::core::mem::MaybeUninit::uninit(); 2 * ::core::mem::size_of::<*const u8>()]); +static mut _RET_AREA: _RetArea = _RetArea( + [::core::mem::MaybeUninit::uninit(); 2 * ::core::mem::size_of::<*const u8>()], +); #[rustfmt::skip] mod _rt { #![allow(dead_code, clippy::all)] @@ -96,7 +92,9 @@ macro_rules! __export_hello_world_impl { #[doc(inline)] pub(crate) use __export_hello_world_impl as export; #[cfg(target_arch = "wasm32")] -#[unsafe(link_section = "component-type:wit-bindgen:0.41.0:wassemble:hello-world:hello-world:encoded world")] +#[unsafe( + link_section = "component-type:wit-bindgen:0.41.0:wassemble:hello-world:hello-world:encoded world" +)] #[doc(hidden)] #[allow(clippy::octal_escapes)] pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 194] = *b"\ diff --git a/crates/openai/Cargo.toml b/crates/openai/Cargo.toml index 639dbf9..493762f 100644 --- a/crates/openai/Cargo.toml +++ b/crates/openai/Cargo.toml @@ -9,6 +9,7 @@ crate-type = ["cdylib"] [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" + waki = { version = "0.5.1", features = ["json"] } wit-bindgen-rt = { version = "0.42.1", features = ["bitflags"] } diff --git a/crates/openai/src/bindings.rs b/crates/openai/src/bindings.rs index 3573a7f..f976e00 100644 --- a/crates/openai/src/bindings.rs +++ b/crates/openai/src/bindings.rs @@ -104,6 +104,50 @@ impl ::core::fmt::Debug for EmbeddingResponse { .finish() } } +/// Error types that can occur during OpenAI API operations +#[derive(Clone)] +pub enum OpenaiError { + /// Failed to send HTTP request + RequestFailed(_rt::String), + /// Failed to get response body + ResponseBodyError(_rt::String), + /// Failed to parse response as UTF-8 + Utf8Error(_rt::String), + /// Failed to parse JSON response + JsonParseError(_rt::String), + /// No choices in response + NoChoices, + /// No embedding data in response + NoEmbeddingData, +} +impl ::core::fmt::Debug for OpenaiError { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + OpenaiError::RequestFailed(e) => { + f.debug_tuple("OpenaiError::RequestFailed").field(e).finish() + } + OpenaiError::ResponseBodyError(e) => { + f.debug_tuple("OpenaiError::ResponseBodyError").field(e).finish() + } + OpenaiError::Utf8Error(e) => { + f.debug_tuple("OpenaiError::Utf8Error").field(e).finish() + } + OpenaiError::JsonParseError(e) => { + f.debug_tuple("OpenaiError::JsonParseError").field(e).finish() + } + OpenaiError::NoChoices => f.debug_tuple("OpenaiError::NoChoices").finish(), + OpenaiError::NoEmbeddingData => { + f.debug_tuple("OpenaiError::NoEmbeddingData").finish() + } + } + } +} +impl ::core::fmt::Display for OpenaiError { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + write!(f, "{:?}", self) + } +} +impl std::error::Error for OpenaiError {} #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn _export_create_chat_completion_cabi( @@ -120,8 +164,7 @@ pub unsafe fn _export_create_chat_completion_cabi( arg10: i32, arg11: i32, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -135,17 +178,13 @@ pub unsafe fn _export_create_chat_completion_cabi( let base = base9.add(i * (4 * ::core::mem::size_of::<*const u8>())); let e9 = { let l3 = *base.add(0).cast::<*mut u8>(); - let l4 = *base - .add(::core::mem::size_of::<*const u8>()) - .cast::(); + let l4 = *base.add(::core::mem::size_of::<*const u8>()).cast::(); let len5 = l4; let bytes5 = _rt::Vec::from_raw_parts(l3.cast(), len5, len5); let l6 = *base .add(2 * ::core::mem::size_of::<*const u8>()) .cast::<*mut u8>(); - let l7 = *base - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); + let l7 = *base.add(3 * ::core::mem::size_of::<*const u8>()).cast::(); let len8 = l7; let bytes8 = _rt::Vec::from_raw_parts(l6.cast(), len8, len8); ChatMessage { @@ -185,81 +224,187 @@ pub unsafe fn _export_create_chat_completion_cabi( }, ); let ptr11 = (&raw mut _RET_AREA.0).cast::(); - let ChatResponse { - id: id12, - model: model12, - content: content12, - finish_reason: finish_reason12, - } = result10; - let vec13 = (id12.into_bytes()).into_boxed_slice(); - let ptr13 = vec13.as_ptr().cast::(); - let len13 = vec13.len(); - ::core::mem::forget(vec13); - *ptr11 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len13; - *ptr11.add(0).cast::<*mut u8>() = ptr13.cast_mut(); - let vec14 = (model12.into_bytes()).into_boxed_slice(); - let ptr14 = vec14.as_ptr().cast::(); - let len14 = vec14.len(); - ::core::mem::forget(vec14); - *ptr11 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len14; - *ptr11 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr14.cast_mut(); - let vec15 = (content12.into_bytes()).into_boxed_slice(); - let ptr15 = vec15.as_ptr().cast::(); - let len15 = vec15.len(); - ::core::mem::forget(vec15); - *ptr11 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::() = len15; - *ptr11 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr15.cast_mut(); - let vec16 = (finish_reason12.into_bytes()).into_boxed_slice(); - let ptr16 = vec16.as_ptr().cast::(); - let len16 = vec16.len(); - ::core::mem::forget(vec16); - *ptr11 - .add(7 * ::core::mem::size_of::<*const u8>()) - .cast::() = len16; - *ptr11 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr16.cast_mut(); + match result10 { + Ok(e) => { + *ptr11.add(0).cast::() = (0i32) as u8; + let ChatResponse { + id: id12, + model: model12, + content: content12, + finish_reason: finish_reason12, + } = e; + let vec13 = (id12.into_bytes()).into_boxed_slice(); + let ptr13 = vec13.as_ptr().cast::(); + let len13 = vec13.len(); + ::core::mem::forget(vec13); + *ptr11.add(2 * ::core::mem::size_of::<*const u8>()).cast::() = len13; + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr13 + .cast_mut(); + let vec14 = (model12.into_bytes()).into_boxed_slice(); + let ptr14 = vec14.as_ptr().cast::(); + let len14 = vec14.len(); + ::core::mem::forget(vec14); + *ptr11.add(4 * ::core::mem::size_of::<*const u8>()).cast::() = len14; + *ptr11.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr14 + .cast_mut(); + let vec15 = (content12.into_bytes()).into_boxed_slice(); + let ptr15 = vec15.as_ptr().cast::(); + let len15 = vec15.len(); + ::core::mem::forget(vec15); + *ptr11.add(6 * ::core::mem::size_of::<*const u8>()).cast::() = len15; + *ptr11.add(5 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr15 + .cast_mut(); + let vec16 = (finish_reason12.into_bytes()).into_boxed_slice(); + let ptr16 = vec16.as_ptr().cast::(); + let len16 = vec16.len(); + ::core::mem::forget(vec16); + *ptr11.add(8 * ::core::mem::size_of::<*const u8>()).cast::() = len16; + *ptr11.add(7 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr16 + .cast_mut(); + } + Err(e) => { + *ptr11.add(0).cast::() = (1i32) as u8; + match e { + OpenaiError::RequestFailed(e) => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (0i32) + as u8; + let vec17 = (e.into_bytes()).into_boxed_slice(); + let ptr17 = vec17.as_ptr().cast::(); + let len17 = vec17.len(); + ::core::mem::forget(vec17); + *ptr11 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::() = len17; + *ptr11 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr17.cast_mut(); + } + OpenaiError::ResponseBodyError(e) => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (1i32) + as u8; + let vec18 = (e.into_bytes()).into_boxed_slice(); + let ptr18 = vec18.as_ptr().cast::(); + let len18 = vec18.len(); + ::core::mem::forget(vec18); + *ptr11 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::() = len18; + *ptr11 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr18.cast_mut(); + } + OpenaiError::Utf8Error(e) => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (2i32) + as u8; + let vec19 = (e.into_bytes()).into_boxed_slice(); + let ptr19 = vec19.as_ptr().cast::(); + let len19 = vec19.len(); + ::core::mem::forget(vec19); + *ptr11 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::() = len19; + *ptr11 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr19.cast_mut(); + } + OpenaiError::JsonParseError(e) => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (3i32) + as u8; + let vec20 = (e.into_bytes()).into_boxed_slice(); + let ptr20 = vec20.as_ptr().cast::(); + let len20 = vec20.len(); + ::core::mem::forget(vec20); + *ptr11 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::() = len20; + *ptr11 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr20.cast_mut(); + } + OpenaiError::NoChoices => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (4i32) + as u8; + } + OpenaiError::NoEmbeddingData => { + *ptr11.add(::core::mem::size_of::<*const u8>()).cast::() = (5i32) + as u8; + } + } + } + }; ptr11 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_create_chat_completion(arg0: *mut u8) { - let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); - _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); - _rt::cabi_dealloc(l2, l3, 1); - let l4 = *arg0 - .add(4 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l5 = *arg0 - .add(5 * ::core::mem::size_of::<*const u8>()) - .cast::(); - _rt::cabi_dealloc(l4, l5, 1); - let l6 = *arg0 - .add(6 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l7 = *arg0 - .add(7 * ::core::mem::size_of::<*const u8>()) - .cast::(); - _rt::cabi_dealloc(l6, l7, 1); + let l0 = i32::from(*arg0.add(0).cast::()); + match l0 { + 0 => { + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::(); + _rt::cabi_dealloc(l1, l2, 1); + let l3 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l4 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::(); + _rt::cabi_dealloc(l3, l4, 1); + let l5 = *arg0 + .add(5 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l6 = *arg0.add(6 * ::core::mem::size_of::<*const u8>()).cast::(); + _rt::cabi_dealloc(l5, l6, 1); + let l7 = *arg0 + .add(7 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l8 = *arg0.add(8 * ::core::mem::size_of::<*const u8>()).cast::(); + _rt::cabi_dealloc(l7, l8, 1); + } + _ => { + let l9 = i32::from( + *arg0.add(::core::mem::size_of::<*const u8>()).cast::(), + ); + match l9 { + 0 => { + let l10 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l11 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l10, l11, 1); + } + 1 => { + let l12 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l13 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l12, l13, 1); + } + 2 => { + let l14 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l15 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l14, l15, 1); + } + 3 => { + let l16 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l17 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l16, l17, 1); + } + 4 => {} + _ => {} + } + } + } } #[doc(hidden)] #[allow(non_snake_case)] @@ -271,8 +416,7 @@ pub unsafe fn _export_create_embedding_cabi( arg4: *mut u8, arg5: usize, ) -> *mut u8 { - #[cfg(target_arch = "wasm32")] - _rt::run_ctors_once(); + #[cfg(target_arch = "wasm32")] _rt::run_ctors_once(); let len0 = arg1; let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); let len1 = arg3; @@ -287,47 +431,152 @@ pub unsafe fn _export_create_embedding_cabi( }, ); let ptr4 = (&raw mut _RET_AREA.0).cast::(); - let EmbeddingResponse { - model: model5, - embedding: embedding5, - } = result3; - let vec6 = (model5.into_bytes()).into_boxed_slice(); - let ptr6 = vec6.as_ptr().cast::(); - let len6 = vec6.len(); - ::core::mem::forget(vec6); - *ptr4 - .add(::core::mem::size_of::<*const u8>()) - .cast::() = len6; - *ptr4.add(0).cast::<*mut u8>() = ptr6.cast_mut(); - let vec7 = (embedding5).into_boxed_slice(); - let ptr7 = vec7.as_ptr().cast::(); - let len7 = vec7.len(); - ::core::mem::forget(vec7); - *ptr4 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::() = len7; - *ptr4 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>() = ptr7.cast_mut(); + match result3 { + Ok(e) => { + *ptr4.add(0).cast::() = (0i32) as u8; + let EmbeddingResponse { model: model5, embedding: embedding5 } = e; + let vec6 = (model5.into_bytes()).into_boxed_slice(); + let ptr6 = vec6.as_ptr().cast::(); + let len6 = vec6.len(); + ::core::mem::forget(vec6); + *ptr4.add(2 * ::core::mem::size_of::<*const u8>()).cast::() = len6; + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr6 + .cast_mut(); + let vec7 = (embedding5).into_boxed_slice(); + let ptr7 = vec7.as_ptr().cast::(); + let len7 = vec7.len(); + ::core::mem::forget(vec7); + *ptr4.add(4 * ::core::mem::size_of::<*const u8>()).cast::() = len7; + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::<*mut u8>() = ptr7 + .cast_mut(); + } + Err(e) => { + *ptr4.add(0).cast::() = (1i32) as u8; + match e { + OpenaiError::RequestFailed(e) => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (0i32) + as u8; + let vec8 = (e.into_bytes()).into_boxed_slice(); + let ptr8 = vec8.as_ptr().cast::(); + let len8 = vec8.len(); + ::core::mem::forget(vec8); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len8; + *ptr4 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr8.cast_mut(); + } + OpenaiError::ResponseBodyError(e) => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (1i32) + as u8; + let vec9 = (e.into_bytes()).into_boxed_slice(); + let ptr9 = vec9.as_ptr().cast::(); + let len9 = vec9.len(); + ::core::mem::forget(vec9); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len9; + *ptr4 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr9.cast_mut(); + } + OpenaiError::Utf8Error(e) => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (2i32) + as u8; + let vec10 = (e.into_bytes()).into_boxed_slice(); + let ptr10 = vec10.as_ptr().cast::(); + let len10 = vec10.len(); + ::core::mem::forget(vec10); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len10; + *ptr4 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr10.cast_mut(); + } + OpenaiError::JsonParseError(e) => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (3i32) + as u8; + let vec11 = (e.into_bytes()).into_boxed_slice(); + let ptr11 = vec11.as_ptr().cast::(); + let len11 = vec11.len(); + ::core::mem::forget(vec11); + *ptr4.add(3 * ::core::mem::size_of::<*const u8>()).cast::() = len11; + *ptr4 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>() = ptr11.cast_mut(); + } + OpenaiError::NoChoices => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (4i32) + as u8; + } + OpenaiError::NoEmbeddingData => { + *ptr4.add(::core::mem::size_of::<*const u8>()).cast::() = (5i32) + as u8; + } + } + } + }; ptr4 } #[doc(hidden)] #[allow(non_snake_case)] pub unsafe fn __post_return_create_embedding(arg0: *mut u8) { - let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0 - .add(::core::mem::size_of::<*const u8>()) - .cast::(); - _rt::cabi_dealloc(l0, l1, 1); - let l2 = *arg0 - .add(2 * ::core::mem::size_of::<*const u8>()) - .cast::<*mut u8>(); - let l3 = *arg0 - .add(3 * ::core::mem::size_of::<*const u8>()) - .cast::(); - let base4 = l2; - let len4 = l3; - _rt::cabi_dealloc(base4, len4 * 8, 8); + let l0 = i32::from(*arg0.add(0).cast::()); + match l0 { + 0 => { + let l1 = *arg0.add(::core::mem::size_of::<*const u8>()).cast::<*mut u8>(); + let l2 = *arg0.add(2 * ::core::mem::size_of::<*const u8>()).cast::(); + _rt::cabi_dealloc(l1, l2, 1); + let l3 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l4 = *arg0.add(4 * ::core::mem::size_of::<*const u8>()).cast::(); + let base5 = l3; + let len5 = l4; + _rt::cabi_dealloc(base5, len5 * 8, 8); + } + _ => { + let l6 = i32::from( + *arg0.add(::core::mem::size_of::<*const u8>()).cast::(), + ); + match l6 { + 0 => { + let l7 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l8 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l7, l8, 1); + } + 1 => { + let l9 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l10 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l9, l10, 1); + } + 2 => { + let l11 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l12 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l11, l12, 1); + } + 3 => { + let l13 = *arg0 + .add(2 * ::core::mem::size_of::<*const u8>()) + .cast::<*mut u8>(); + let l14 = *arg0 + .add(3 * ::core::mem::size_of::<*const u8>()) + .cast::(); + _rt::cabi_dealloc(l13, l14, 1); + } + 4 => {} + _ => {} + } + } + } } pub trait Guest { /// Creates a chat completion using OpenAI's API @@ -337,8 +586,11 @@ pub trait Guest { /// - api-key: Your OpenAI API key for authentication /// - completion: The chat completion configuration and conversation /// - /// Returns: The generated response from the assistant - fn create_chat_completion(api_key: _rt::String, completion: ChatCompletion) -> ChatResponse; + /// Returns: The generated response from the assistant or an error + fn create_chat_completion( + api_key: _rt::String, + completion: ChatCompletion, + ) -> Result; /// Creates an embedding vector using OpenAI's API /// Converts text into a numerical representation for semantic analysis /// @@ -346,8 +598,11 @@ pub trait Guest { /// - api-key: Your OpenAI API key for authentication /// - embedding: The embedding configuration and input text /// - /// Returns: The numerical vector representation of the input text - fn create_embedding(api_key: _rt::String, embedding: Embedding) -> EmbeddingResponse; + /// Returns: The numerical vector representation of the input text or an error + fn create_embedding( + api_key: _rt::String, + embedding: Embedding, + ) -> Result; } #[doc(hidden)] macro_rules! __export_world_openai_cabi { @@ -374,9 +629,10 @@ macro_rules! __export_world_openai_cabi { pub(crate) use __export_world_openai_cabi; #[cfg_attr(target_pointer_width = "64", repr(align(8)))] #[cfg_attr(target_pointer_width = "32", repr(align(4)))] -struct _RetArea([::core::mem::MaybeUninit; 8 * ::core::mem::size_of::<*const u8>()]); -static mut _RET_AREA: _RetArea = - _RetArea([::core::mem::MaybeUninit::uninit(); 8 * ::core::mem::size_of::<*const u8>()]); +struct _RetArea([::core::mem::MaybeUninit; 9 * ::core::mem::size_of::<*const u8>()]); +static mut _RET_AREA: _RetArea = _RetArea( + [::core::mem::MaybeUninit::uninit(); 9 * ::core::mem::size_of::<*const u8>()], +); #[rustfmt::skip] mod _rt { #![allow(dead_code, clippy::all)] @@ -440,21 +696,26 @@ macro_rules! __export_openai_impl { #[doc(inline)] pub(crate) use __export_openai_impl as export; #[cfg(target_arch = "wasm32")] -#[unsafe(link_section = "component-type:wit-bindgen:0.41.0:wassemble:openai@0.1.0:openai:encoded world")] +#[unsafe( + link_section = "component-type:wit-bindgen:0.41.0:wassemble:openai@0.1.0:openai:encoded world" +)] #[doc(hidden)] #[allow(clippy::octal_escapes)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 516] = *b"\ -\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\x87\x03\x01A\x02\x01\ -A\x12\x01r\x02\x04roles\x07contents\x03\0\x0cchat-message\x03\0\0\x01p\x01\x01ku\ +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 657] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\x94\x04\x01A\x02\x01\ +A\x16\x01r\x02\x04roles\x07contents\x03\0\x0cchat-message\x03\0\0\x01p\x01\x01ku\ \x01ky\x01r\x05\x02ids\x05models\x08messages\x02\x0btemperature\x03\x0amax-token\ s\x04\x03\0\x0fchat-completion\x03\0\x05\x01r\x04\x02ids\x05models\x07contents\x0d\ finish-reasons\x03\0\x0dchat-response\x03\0\x07\x01r\x02\x05models\x05inputs\x03\ \0\x09embedding\x03\0\x09\x01pu\x01r\x02\x05models\x09embedding\x0b\x03\0\x12emb\ -edding-response\x03\0\x0c\x01@\x02\x07api-keys\x0acompletion\x06\0\x08\x04\0\x16\ -create-chat-completion\x01\x0e\x01@\x02\x07api-keys\x09embedding\x0a\0\x0d\x04\0\ -\x10create-embedding\x01\x0f\x04\0\x1dwassemble:openai/openai@0.1.0\x04\0\x0b\x0c\ -\x01\0\x06openai\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-componen\ -t\x070.227.1\x10wit-bindgen-rust\x060.41.0"; +edding-response\x03\0\x0c\x01q\x06\x0erequest-failed\x01s\0\x13response-body-err\ +or\x01s\0\x0autf8-error\x01s\0\x10json-parse-error\x01s\0\x0ano-choices\0\0\x11n\ +o-embedding-data\0\0\x03\0\x0copenai-error\x03\0\x0e\x01j\x01\x08\x01\x0f\x01@\x02\ +\x07api-keys\x0acompletion\x06\0\x10\x04\0\x16create-chat-completion\x01\x11\x01\ +j\x01\x0d\x01\x0f\x01@\x02\x07api-keys\x09embedding\x0a\0\x12\x04\0\x10create-em\ +bedding\x01\x13\x04\0\x1dwassemble:openai/openai@0.1.0\x04\0\x0b\x0c\x01\0\x06op\ +enai\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-component\x070.227.1\ +\x10wit-bindgen-rust\x060.41.0"; #[inline(never)] #[doc(hidden)] pub fn __link_custom_section_describing_imports() { diff --git a/crates/openai/src/lib.rs b/crates/openai/src/lib.rs index 1913fc8..a65764f 100644 --- a/crates/openai/src/lib.rs +++ b/crates/openai/src/lib.rs @@ -5,12 +5,10 @@ use bindings::Guest; use serde::{Deserialize, Serialize}; use waki::Client; -use crate::bindings::{ChatCompletion, ChatResponse, Embedding, EmbeddingResponse}; +use crate::bindings::{ChatCompletion, ChatResponse, Embedding, EmbeddingResponse, OpenaiError}; const OPENAI_API_BASE: &str = "https://api.openai.com/v1"; -// TODO: remove unwrap - #[derive(Deserialize, Serialize)] struct OpenAIChatResponse { id: String, @@ -63,7 +61,10 @@ struct SerializableEmbedding<'a> { struct Component; impl Guest for Component { - fn create_chat_completion(api_key: String, completion: ChatCompletion) -> ChatResponse { + fn create_chat_completion( + api_key: String, + completion: ChatCompletion, + ) -> Result { let messages: Vec = completion .messages .iter() @@ -78,65 +79,79 @@ impl Guest for Component { temperature: completion.temperature, max_tokens: completion.max_tokens, }; + let response = Client::new() .post(&format!("{OPENAI_API_BASE}/chat/completions")) .header("Authorization", format!("Bearer {api_key}")) .header("Content-Type", "application/json") .json(&serializable) .send() - .map_err(|e| format!("Failed to send request: {e}")) - .unwrap(); + .map_err(|e| OpenaiError::RequestFailed(format!("Failed to send request: {e}")))?; - let body = response - .body() - .map_err(|e| format!("Failed to get response body: {e}")) - .unwrap(); + let body = response.body().map_err(|e| { + OpenaiError::ResponseBodyError(format!("Failed to get response body: {e}")) + })?; - let body_str = String::from_utf8(body) - .map_err(|e| format!("Failed to parse response as UTF-8: {e}")) - .unwrap(); + let body_str = String::from_utf8(body).map_err(|e| { + OpenaiError::Utf8Error(format!("Failed to parse response as UTF-8: {e}")) + })?; - let openai_response: OpenAIChatResponse = serde_json::from_str(&body_str).unwrap(); - let choice = &openai_response.choices[0]; + let openai_response: OpenAIChatResponse = serde_json::from_str(&body_str).map_err(|e| { + OpenaiError::JsonParseError(format!("Failed to parse JSON response: {e}")) + })?; - ChatResponse { + let choice = openai_response + .choices + .first() + .ok_or(OpenaiError::NoChoices)?; + + Ok(ChatResponse { id: openai_response.id, model: openai_response.model, content: choice.message.content.clone(), finish_reason: choice.finish_reason.clone(), - } + }) } - fn create_embedding(api_key: String, embedding: Embedding) -> EmbeddingResponse { + fn create_embedding( + api_key: String, + embedding: Embedding, + ) -> Result { let serializable = SerializableEmbedding { model: &embedding.model, input: &embedding.input, }; + let response = Client::new() .post(&format!("{OPENAI_API_BASE}/embeddings")) .header("Authorization", format!("Bearer {api_key}")) .header("Content-Type", "application/json") .json(&serializable) .send() - .map_err(|e| format!("Failed to send request: {e}")) - .unwrap(); + .map_err(|e| OpenaiError::RequestFailed(format!("Failed to send request: {e}")))?; + + let body = response.body().map_err(|e| { + OpenaiError::ResponseBodyError(format!("Failed to get response body: {e}")) + })?; - let body = response - .body() - .map_err(|e| format!("Failed to get response body: {e}")) - .unwrap(); + let body_str = String::from_utf8(body).map_err(|e| { + OpenaiError::Utf8Error(format!("Failed to parse response as UTF-8: {e}")) + })?; - let body_str = String::from_utf8(body) - .map_err(|e| format!("Failed to parse response as UTF-8: {e}")) - .unwrap(); + let openai_response: OpenAIEmbeddingResponse = + serde_json::from_str(&body_str).map_err(|e| { + OpenaiError::JsonParseError(format!("Failed to parse JSON response: {e}")) + })?; - let openai_response: OpenAIEmbeddingResponse = serde_json::from_str(&body_str).unwrap(); - let data = &openai_response.data[0]; + let data = openai_response + .data + .first() + .ok_or(OpenaiError::NoEmbeddingData)?; - EmbeddingResponse { + Ok(EmbeddingResponse { model: openai_response.model, embedding: data.embedding.clone(), - } + }) } } @@ -185,7 +200,8 @@ mod tests { let api_key = get_api_key().unwrap(); let completion = create_test_chat_completion(); - let response = Component::create_chat_completion(api_key, completion); + let response = Component::create_chat_completion(api_key, completion) + .expect("Chat completion should succeed"); // Verify response structure assert!(!response.id.is_empty(), "Response ID should not be empty"); @@ -229,7 +245,8 @@ mod tests { let mut completion = create_test_chat_completion(); completion.model = model.to_string(); - let response = Component::create_chat_completion(api_key.clone(), completion); + let response = Component::create_chat_completion(api_key.clone(), completion) + .expect("Chat completion should succeed"); assert!( !response.content.is_empty(), @@ -254,7 +271,8 @@ mod tests { let mut completion = create_test_chat_completion(); completion.temperature = Some(temp); - let response = Component::create_chat_completion(api_key.clone(), completion); + let response = Component::create_chat_completion(api_key.clone(), completion) + .expect("Chat completion should succeed"); assert!( !response.content.is_empty(), @@ -272,7 +290,8 @@ mod tests { let mut completion = create_test_chat_completion(); completion.max_tokens = Some(10); - let response = Component::create_chat_completion(api_key, completion); + let response = Component::create_chat_completion(api_key, completion) + .expect("Chat completion should succeed"); assert!( !response.content.is_empty(), @@ -288,7 +307,8 @@ mod tests { let api_key = get_api_key().unwrap(); let embedding = create_test_embedding(); - let response = Component::create_embedding(api_key, embedding); + let response = + Component::create_embedding(api_key, embedding).expect("Embedding should succeed"); // Verify response structure assert!( @@ -340,7 +360,8 @@ mod tests { input: input.to_string(), }; - let response = Component::create_embedding(api_key.clone(), embedding); + let response = Component::create_embedding(api_key.clone(), embedding) + .expect("Embedding should succeed"); assert!( !response.embedding.is_empty(), @@ -363,8 +384,10 @@ mod tests { let api_key = get_api_key().unwrap(); let embedding = create_test_embedding(); - let response1 = Component::create_embedding(api_key.clone(), embedding.clone()); - let response2 = Component::create_embedding(api_key, embedding); + let response1 = Component::create_embedding(api_key.clone(), embedding.clone()) + .expect("First embedding should succeed"); + let response2 = Component::create_embedding(api_key, embedding) + .expect("Second embedding should succeed"); // Embeddings should be identical for the same input assert_eq!(response1.embedding.len(), response2.embedding.len()); @@ -384,7 +407,7 @@ mod tests { let completion = create_test_chat_completion(); let result = std::panic::catch_unwind(|| { - Component::create_chat_completion(invalid_api_key, completion); + let _ = Component::create_chat_completion(invalid_api_key, completion); }); assert!(result.is_err(), "Should panic with invalid API key"); @@ -398,7 +421,7 @@ mod tests { let embedding = create_test_embedding(); let result = std::panic::catch_unwind(|| { - Component::create_embedding(invalid_api_key, embedding); + let _ = Component::create_embedding(invalid_api_key, embedding); }); assert!(result.is_err(), "Should panic with invalid API key"); @@ -422,7 +445,8 @@ mod tests { max_tokens: Some(100), }; - let response1 = Component::create_chat_completion(api_key.clone(), completion1); + let response1 = Component::create_chat_completion(api_key.clone(), completion1) + .expect("First chat completion should succeed"); assert!(!response1.content.is_empty()); // Follow-up message using the response @@ -447,7 +471,8 @@ mod tests { max_tokens: Some(100), }; - let response2 = Component::create_chat_completion(api_key, completion2); + let response2 = Component::create_chat_completion(api_key, completion2) + .expect("Second chat completion should succeed"); assert!(!response2.content.is_empty()); assert_ne!( response1.content, response2.content, @@ -473,7 +498,8 @@ mod tests { run_if_api_key_available(|| { let api_key = get_api_key().unwrap(); let completion = create_test_chat_completion(); - let response = Component::create_chat_completion(api_key, completion); + let response = Component::create_chat_completion(api_key, completion) + .expect("Chat completion should succeed"); assert!(!response.content.is_empty()); }); } diff --git a/crates/openai/wit/world.wit b/crates/openai/wit/world.wit index ce5db92..48014d0 100644 --- a/crates/openai/wit/world.wit +++ b/crates/openai/wit/world.wit @@ -60,6 +60,22 @@ world openai { embedding: list, } + /// Error types that can occur during OpenAI API operations + variant openai-error { + /// Failed to send HTTP request + request-failed(string), + /// Failed to get response body + response-body-error(string), + /// Failed to parse response as UTF-8 + utf8-error(string), + /// Failed to parse JSON response + json-parse-error(string), + /// No choices in response + no-choices, + /// No embedding data in response + no-embedding-data, + } + /// Creates a chat completion using OpenAI's API /// Sends a conversation to OpenAI and returns the assistant's response /// @@ -67,8 +83,8 @@ world openai { /// - api-key: Your OpenAI API key for authentication /// - completion: The chat completion configuration and conversation /// - /// Returns: The generated response from the assistant - export create-chat-completion: func(api-key: string, completion: chat-completion) -> chat-response; + /// Returns: The generated response from the assistant or an error + export create-chat-completion: func(api-key: string, completion: chat-completion) -> result; /// Creates an embedding vector using OpenAI's API /// Converts text into a numerical representation for semantic analysis @@ -77,6 +93,6 @@ world openai { /// - api-key: Your OpenAI API key for authentication /// - embedding: The embedding configuration and input text /// - /// Returns: The numerical vector representation of the input text - export create-embedding: func(api-key: string, embedding: embedding) -> embedding-response; + /// Returns: The numerical vector representation of the input text or an error + export create-embedding: func(api-key: string, embedding: embedding) -> result; } diff --git a/rustfmt.toml b/rustfmt.toml index 44b6aab..69c2a73 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,2 +1,3 @@ group_imports = "StdExternalCrate" imports_granularity = "Crate" +ignore = ["**/bindings.rs"]