Files
hakorune/plugins/nyash-filebox-plugin/src/state.rs

107 lines
2.6 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! State management for FileBox plugin
use once_cell::sync::Lazy;
use std::collections::HashMap;
use std::fs::File;
use std::sync::{
atomic::{AtomicU32, Ordering},
Mutex,
};
// ============ FileBox Instance ============
pub struct FileBoxInstance {
pub file: Option<File>,
pub path: String,
pub buffer: Option<Vec<u8>>, // プラグインが管理するバッファ
}
impl FileBoxInstance {
pub fn new() -> Self {
Self {
file: None,
path: String::new(),
buffer: None,
}
}
#[allow(dead_code)]
pub fn with_path(path: String) -> Self {
Self {
file: None,
path,
buffer: None,
}
}
}
// グローバルインスタンス管理
pub static INSTANCES: Lazy<Mutex<HashMap<u32, FileBoxInstance>>> =
Lazy::new(|| Mutex::new(HashMap::new()));
// インスタンスIDカウンタ1開始
pub static INSTANCE_COUNTER: AtomicU32 = AtomicU32::new(1);
/// Allocate a new instance ID
#[allow(dead_code)]
pub fn allocate_instance_id() -> u32 {
INSTANCE_COUNTER.fetch_add(1, Ordering::Relaxed)
}
/// Store an instance with the given ID
#[allow(dead_code)]
pub fn store_instance(id: u32, instance: FileBoxInstance) -> Result<(), &'static str> {
match INSTANCES.lock() {
Ok(mut map) => {
map.insert(id, instance);
Ok(())
}
Err(_) => Err("Failed to lock instances map"),
}
}
/// Remove an instance by ID
#[allow(dead_code)]
pub fn remove_instance(id: u32) -> Option<FileBoxInstance> {
match INSTANCES.lock() {
Ok(mut map) => map.remove(&id),
Err(_) => None,
}
}
/// Get mutable access to an instance
#[allow(dead_code)]
pub fn with_instance_mut<F, R>(id: u32, f: F) -> Result<R, &'static str>
where
F: FnOnce(&mut FileBoxInstance) -> R,
{
match INSTANCES.lock() {
Ok(mut map) => match map.get_mut(&id) {
Some(instance) => Ok(f(instance)),
None => Err("Instance not found"),
},
Err(_) => Err("Failed to lock instances map"),
}
}
/// Get access to an instance
#[allow(dead_code)]
pub fn with_instance<F, R>(id: u32, f: F) -> Result<R, &'static str>
where
F: FnOnce(&FileBoxInstance) -> R,
{
match INSTANCES.lock() {
Ok(map) => match map.get(&id) {
Some(instance) => Ok(f(instance)),
None => Err("Instance not found"),
},
Err(_) => Err("Failed to lock instances map"),
}
}
/// Clear all instances from the registry
pub fn clear_instances() {
if let Ok(mut map) = INSTANCES.lock() {
map.clear();
}
}