📄 src/main.rs
mod proto;
mod receipt_printer;
mod receipt_printer_service;
mod typst_renderer;

use std::env::args;
use tonic::transport::Server;

use crate::proto::receipt_printer_server::ReceiptPrinterServer;
use crate::receipt_printer::ReceiptPrinter;
use crate::receipt_printer_service::ReceiptPrinterService;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<_> = args().skip(1).collect();
    if args.len() != 1 {
        println!("Please provide the printer connection string as arguments");
        return Ok(());
    };
    let Some((printer_host, printer_port)) = args[0]
        .split_once(':')
        .and_then(|(a, b)| b.parse::<u16>().ok().map(|b| (a, b)))
    else {
        println!("Printer connection string must be on format `host:port`");
        return Ok(());
    };

    let receipt_printer = ReceiptPrinter::init(printer_host.to_owned(), printer_port);

    let receipt_printer_service = ReceiptPrinterService::new(receipt_printer);

    Server::builder()
        .add_service(ReceiptPrinterServer::new(receipt_printer_service))
        .serve("[::1]:50051".parse()?)
        .await?;

    Ok(())
}