ecash_client/
qr.rs

1use crate::error::{ClientError, Result};
2use ecash_core::Token;
3use image::{ImageBuffer, Luma};
4use qrcode::QrCode;
5
6pub struct QrCodeGenerator;
7
8impl QrCodeGenerator {
9    pub fn generate_token_qr(token: &Token) -> Result<ImageBuffer<Luma<u8>, Vec<u8>>> {
10        let token_json = serde_json::to_string(token)
11            .map_err(|e| ClientError::QrCode(format!("Serialization failed: {}", e)))?;
12        
13        let code = QrCode::new(token_json.as_bytes())
14            .map_err(|e| ClientError::QrCode(format!("QR generation failed: {}", e)))?;
15        
16        let image = code.render::<Luma<u8>>()
17            .min_dimensions(200, 200)
18            .build();
19        
20        Ok(image)
21    }
22
23    pub fn generate_payment_request_qr(amount: u64, recipient: &str) -> Result<ImageBuffer<Luma<u8>, Vec<u8>>> {
24        let payment_data = serde_json::json!({
25            "type": "payment_request",
26            "amount": amount,
27            "recipient": recipient,
28        });
29        
30        let payment_json = serde_json::to_string(&payment_data)
31            .map_err(|e| ClientError::QrCode(format!("Serialization failed: {}", e)))?;
32        
33        let code = QrCode::new(payment_json.as_bytes())
34            .map_err(|e| ClientError::QrCode(format!("QR generation failed: {}", e)))?;
35        
36        let image = code.render::<Luma<u8>>()
37            .min_dimensions(200, 200)
38            .build();
39        
40        Ok(image)
41    }
42
43    pub fn save_qr_png(image: &ImageBuffer<Luma<u8>, Vec<u8>>, path: &str) -> Result<()> {
44        image.save(path)
45            .map_err(|e| ClientError::QrCode(format!("Failed to save image: {}", e)))?;
46        Ok(())
47    }
48}