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}