mirror of
https://github.com/tribufu/sdk-rust
synced 2025-06-16 11:14:17 +00:00
Add native instance and runtime statics
This commit is contained in:
@ -5,8 +5,10 @@
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
tribufu_api_initialize();
|
||||||
char *version = tribufu_api_get_user_agent();
|
char *version = tribufu_api_get_user_agent();
|
||||||
printf("%s\n", version);
|
printf("%s\n", version);
|
||||||
tribufu_free_string(version);
|
tribufu_free_string(version);
|
||||||
|
tribufu_api_shutdown();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,10 @@
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
tribufu_api_initialize();
|
||||||
const char *version = tribufu_api_get_user_agent();
|
const char *version = tribufu_api_get_user_agent();
|
||||||
std::cout << version << std::endl;
|
std::cout << version << std::endl;
|
||||||
tribufu_free_string((char *)version);
|
tribufu_free_string((char *)version);
|
||||||
|
tribufu_api_shutdown();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5,18 +5,34 @@
|
|||||||
|
|
||||||
#include <tribufu/prelude.h>
|
#include <tribufu/prelude.h>
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_api_default(void);
|
typedef void TribufuApiGetUserInfoCallbackData;
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_api_from_env(void);
|
typedef void (*TribufuApiGetUserInfoCallback)(void*, const TribufuApiGetUserInfoCallbackData*);
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_api_from_env_or_default(void);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the user agent string for the Tribufu API.
|
||||||
|
*/
|
||||||
TRIBUFU_API const char *tribufu_api_get_user_agent(void);
|
TRIBUFU_API const char *tribufu_api_get_user_agent(void);
|
||||||
|
|
||||||
|
TRIBUFU_API void tribufu_api_get_user_info(void *context, TribufuApiGetUserInfoCallback callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the version of the Tribufu API.
|
||||||
|
*/
|
||||||
TRIBUFU_API const char *tribufu_api_get_version(void);
|
TRIBUFU_API const char *tribufu_api_get_version(void);
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_api_new(void);
|
/**
|
||||||
|
* Initialize the Tribufu API instance.
|
||||||
|
*
|
||||||
|
* This must be called before any other API functions.
|
||||||
|
*/
|
||||||
|
TRIBUFU_API bool tribufu_api_initialize(void);
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_api_with_api_key(void);
|
/**
|
||||||
|
* Shutdown the Tribufu API instance.
|
||||||
|
*
|
||||||
|
* This must be called when the API is no longer needed.
|
||||||
|
*/
|
||||||
|
TRIBUFU_API void tribufu_api_shutdown(void);
|
||||||
|
|
||||||
TRIBUFU_API void tribufu_free_string(char *ptr);
|
TRIBUFU_API void tribufu_free_string(char *ptr);
|
||||||
|
@ -15,4 +15,7 @@ path = "lib.rs"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tribufu = { path = "../../" }
|
tribufu = { path = "../../" }
|
||||||
|
futures = "0.3.31"
|
||||||
libc = "0.2.172"
|
libc = "0.2.172"
|
||||||
|
once_cell = "1.19.0"
|
||||||
|
tokio = { version = "1.45.1", features = ["full"] }
|
||||||
|
@ -1,33 +1,88 @@
|
|||||||
// Copyright (c) Tribufu. All Rights Reserved.
|
// Copyright (c) Tribufu. All Rights Reserved.
|
||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
|
|
||||||
|
use crate::models::{TribufuApiCallbackContext, TribufuApiGetUserInfoCallback};
|
||||||
|
use futures::lock::Mutex;
|
||||||
|
use libc::{c_char, c_void};
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::os::raw::c_char;
|
use std::ptr;
|
||||||
|
use tokio::runtime::Runtime;
|
||||||
|
use tribufu::apis::tribufu_generated_api::TribufuGeneratedApiClient;
|
||||||
use tribufu::TribufuApi;
|
use tribufu::TribufuApi;
|
||||||
|
|
||||||
#[no_mangle]
|
static INSTANCE: Lazy<Mutex<Option<TribufuGeneratedApiClient>>> = Lazy::new(|| Mutex::new(None));
|
||||||
pub extern "C" fn tribufu_api_new() {}
|
static RUNTIME: Lazy<Runtime> = Lazy::new(|| Runtime::new().unwrap());
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn tribufu_api_default() {}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn tribufu_api_with_api_key() {}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn tribufu_api_from_env() {}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn tribufu_api_from_env_or_default() {}
|
|
||||||
|
|
||||||
|
/// Gets the version of the Tribufu API.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn tribufu_api_get_version() -> *const c_char {
|
pub extern "C" fn tribufu_api_get_version() -> *const c_char {
|
||||||
CString::new(TribufuApi::get_version()).unwrap().into_raw()
|
CString::new(TribufuApi::get_version()).unwrap().into_raw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the user agent string for the Tribufu API.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn tribufu_api_get_user_agent() -> *const c_char {
|
pub extern "C" fn tribufu_api_get_user_agent() -> *const c_char {
|
||||||
CString::new(TribufuApi::get_user_agent())
|
CString::new(TribufuApi::get_user_agent())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.into_raw()
|
.into_raw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Initialize the Tribufu API instance.
|
||||||
|
///
|
||||||
|
/// This must be called before any other API functions.
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn tribufu_api_initialize() -> bool {
|
||||||
|
let api = TribufuApi::from_env_or_default(None);
|
||||||
|
|
||||||
|
if INSTANCE.try_lock().is_none() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut instance = INSTANCE.try_lock().unwrap();
|
||||||
|
*instance = Some(api);
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shutdown the Tribufu API instance.
|
||||||
|
///
|
||||||
|
/// This must be called when the API is no longer needed.
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn tribufu_api_shutdown() {
|
||||||
|
if INSTANCE.try_lock().is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut instance = INSTANCE.try_lock().unwrap();
|
||||||
|
*instance = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
pub extern "C" fn tribufu_api_get_user_info(
|
||||||
|
context: *mut c_void,
|
||||||
|
callback: TribufuApiGetUserInfoCallback,
|
||||||
|
) {
|
||||||
|
let context = TribufuApiCallbackContext(context);
|
||||||
|
|
||||||
|
RUNTIME.spawn(async move {
|
||||||
|
let mut instance = INSTANCE.lock().await;
|
||||||
|
if instance.is_none() {
|
||||||
|
callback(context.as_ptr(), ptr::null());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let api = instance.as_mut();
|
||||||
|
if api.is_none() {
|
||||||
|
callback(context.as_ptr(), ptr::null());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let api = api.unwrap();
|
||||||
|
|
||||||
|
// TODO: Implement logic here
|
||||||
|
|
||||||
|
callback(context.as_ptr(), ptr::null());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
// Copyright (c) Tribufu. All Rights Reserved.
|
// Copyright (c) Tribufu. All Rights Reserved.
|
||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
pub mod api;
|
pub mod api;
|
||||||
pub mod mem;
|
pub mod mem;
|
||||||
|
pub mod models;
|
||||||
|
19
src/native/models.rs
Normal file
19
src/native/models.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) Tribufu. All Rights Reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
use libc::c_void;
|
||||||
|
|
||||||
|
pub struct TribufuApiCallbackContext(pub(crate) *mut c_void);
|
||||||
|
|
||||||
|
impl TribufuApiCallbackContext {
|
||||||
|
pub(crate) fn as_ptr(&self) -> *mut c_void {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for TribufuApiCallbackContext {}
|
||||||
|
unsafe impl Sync for TribufuApiCallbackContext {}
|
||||||
|
|
||||||
|
pub type TribufuApiGetUserInfoCallbackData = c_void;
|
||||||
|
pub type TribufuApiGetUserInfoCallback =
|
||||||
|
extern "C" fn(*mut c_void, *const TribufuApiGetUserInfoCallbackData);
|
Reference in New Issue
Block a user