dx_forge/api/
cart.rs

1//! Cart System — The Gateway Drug to dx
2
3use anyhow::Result;
4use serde::{Serialize, Deserialize};
5use std::path::PathBuf;
6use parking_lot::RwLock;
7use std::sync::Arc;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct CartItem {
11    pub id: String,
12    pub package_id: String,
13    pub variant: Option<String>,
14    pub files: Vec<PathBuf>,
15    pub config: serde_json::Value,
16}
17
18static mut CART: Option<Arc<RwLock<Vec<CartItem>>>> = None;
19
20fn get_cart() -> Arc<RwLock<Vec<CartItem>>> {
21    unsafe {
22        if CART.is_none() {
23            CART = Some(Arc::new(RwLock::new(Vec::new())));
24        }
25        CART.as_ref().unwrap().clone()
26    }
27}
28
29pub fn stage_item_in_cart(item: CartItem) -> Result<()> {
30    let cart = get_cart();
31    let mut cart = cart.write();
32    
33    tracing::info!("🛒 Staging item in cart: {}", item.package_id);
34    cart.push(item);
35    
36    Ok(())
37}
38
39pub fn commit_entire_cart() -> Result<Vec<PathBuf>> {
40    let cart = get_cart();
41    let cart_items = cart.read().clone();
42    
43    tracing::info!("✅ Committing cart with {} items", cart_items.len());
44    
45    let mut installed_files = Vec::new();
46    
47    for item in &cart_items {
48        // Install each item
49        installed_files.extend(item.files.clone());
50    }
51    
52    // Clear cart after commit
53    drop(cart_items);
54    cart.write().clear();
55    
56    Ok(installed_files)
57}
58
59pub fn commit_cart_immediately() -> Result<Vec<PathBuf>> {
60    commit_entire_cart()
61}
62
63pub fn clear_cart_completely() -> Result<()> {
64    let cart = get_cart();
65    let mut cart = cart.write();
66    
67    tracing::info!("🗑️  Clearing cart ({} items)", cart.len());
68    cart.clear();
69    
70    Ok(())
71}
72
73pub fn remove_specific_cart_item(item_id: &str) -> Result<()> {
74    let cart = get_cart();
75    let mut cart = cart.write();
76    
77    cart.retain(|item| item.id != item_id);
78    tracing::info!("➖ Removed item from cart: {}", item_id);
79    
80    Ok(())
81}
82
83pub fn get_current_cart_contents() -> Result<Vec<CartItem>> {
84    let cart = get_cart();
85    let items = cart.read().clone();
86    Ok(items)
87}
88
89pub fn export_cart_as_shareable_json() -> Result<String> {
90    let cart = get_cart();
91    let cart = cart.read();
92    
93    Ok(serde_json::to_string_pretty(&*cart)?)
94}
95
96pub fn import_cart_from_json(json: &str) -> Result<()> {
97    let items: Vec<CartItem> = serde_json::from_str(json)?;
98    
99    let cart = get_cart();
100    let mut cart = cart.write();
101    
102    tracing::info!("📥 Importing {} items into cart", items.len());
103    cart.extend(items);
104    
105    Ok(())
106}