cand

Crates.iocand
lib.rscand
version0.2.1
created_at2025-07-26 20:37:32.918823+00
updated_at2025-08-25 13:18:34.675227+00
descriptionBeautiful embedded-first Rust logging library for ESP32 to servers with colorful output and zero-panic design.
homepage
repositoryhttps://github.com/CosmoBunny/cand.git
max_upload_size
id1769447
size348,780
CosmoBunny (CosmoBunny)

documentation

README

๐ŸŽฏ CAND - Colorful And Nice Debugging

Beautiful embedded-first Rust logging library for ESP32 to servers with colorful output and zero-panic design.

โœจ Why Choose CAND?

Feature Benefit Use Case
๐ŸŽจ Smart Colors Spot issues instantly logger.log_err("โŒ Clear visibility")
โšก no_std Ready Runs everywhere ESP32, STM32, WASM, bare metal
๐Ÿ›ก๏ธ Never Panic Production safe try_run() and try_get() handles all errors gracefully
๐Ÿ”Œ Pluggable Your infrastructure Files, UART, RTT, databases, networks
๐Ÿ“ฆ Tiny Binary <1KB overhead Perfect for memory-constrained devices
๐ŸŽฏ 2-Line Setup Start in seconds Works out of the box

๐Ÿš€ Quick Start

Desktop/Server

[dependencies]
cand = "0.2.1"
use cand::Logger;
use std::time::Instant;

fn main() {
  let mut logger = Logger(Instant::now(), ());
    
  logger.log_ok("๐Ÿš€ Server started successfully!");
  logger.log_info("๐Ÿ“ก Listening on port 8080");
  logger.log_warn("โš ๏ธ High memory usage: 87%");
  logger.log_err("โŒ Database connection failed");
}

Embedded/ESP32 with no_std

[dependencies]
cand = { version = "0.2.1", default-feature=false, features=["colors"] }

๐ŸŽจ Beautiful Output

CAND automatically color-codes your logs for instant visual feedback:

  • ๐ŸŸข log_ok() - Success operations (green)
  • ๐Ÿ”ต log_info() - Informational messages (blue)
  • ๐ŸŸก log_warn() - Warnings that need attention (yellow)
  • ๐Ÿ”ด log_err() - Critical errors (red)

sample of output

๐Ÿ›ก๏ธ Error Handling That Never Panics

use cand::Logger;

fn risky_operation() -> Result<String, &'static str> {
  Err("network timeout")
}

fn fallback_handler(mut logger: Logger<std::time::Instant, ()>) {
  logger.log_warn("๐Ÿ”„ Entering fallback mode");
  logger.log_info("๐Ÿ’พ Switching to cached data");
}

fn main() {
  let logger = Logger(std::time::Instant::now(), ());
    
  // Automatic error logging and graceful recovery
  let (data, recovered_logger) = logger.try_get(
    risky_operation(),
    fallback_handler
  );
}


Embedded UART

struct UartStorage{
  // Serial can be from any mcu serial
  serial: Serial 
};

impl StorageProvider for UartStorage {
  fn write_data(&mut self, d: impl ufmt::uDebug) {
    // Write to UART, RTT, or any embedded output
    ufmt::uwrite!(self.serial,"{:?}", d);
  }
}

๐ŸŽ›๏ธ Feature Flags

Feature Description Default
std Standard library support, enables Instant time provider โœ…
colors ANSI color output for beautiful terminal logs โœ…
ufmt Embedded-friendly formatting with zero allocations No

๐Ÿ“Š Performance

  • โšก Zero allocations with ufmt feature
  • ๐Ÿš€ 1_000_000 logs in 4.2s on example benchmark with decent release

๐Ÿ—๏ธ API Reference

Core Types

// Make sure Type should TimeProvider or StorageProvider
// Main logger with time and storage providers
pub struct Logger<T: TimeProvider, S: StorageProvider>(pub T, pub S);

๐Ÿงช Examples

Check out the examples directory:

Run examples:

cargo run --example sample

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

Commit count: 0

cargo fmt