| Crates.io | magic-rs |
| lib.rs | magic-rs |
| version | 0.1.0 |
| created_at | 2025-11-14 14:04:01.411227+00 |
| updated_at | 2025-11-14 14:04:01.411227+00 |
| description | Safe Rust re-implementation of libmagic |
| homepage | |
| repository | https://github.com/qjerome/magic-rs/ |
| max_upload_size | |
| id | 1932917 |
| size | 258,043 |
magic-rs: A Safe Rust Reimplementation of libmagicThis crate provides a high-performance, memory-safe alternative to the traditional
libmagic (used by the file command). It supports file type detection,
MIME type inference, and custom magic rule parsing.
Add magic-rs to your Cargo.toml:
[dependencies]
magic-rs = "0.1" # Replace with the latest version
Or add the latest version with cargo:
cargo add magic-rs
use magic_rs::{MagicDb, MagicSource};
use std::fs::File;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = MagicDb::new();
// Create a MagicSource from a file
let rust_magic = MagicSource::open("../magic-db/src/magdir/rust")?;
db.load(rust_magic)?;
// Open a file and detect its type
let mut file = File::open("src/lib.rs")?;
let magic = db.magic_first(&mut file, None)?;
println!(
"File type: {} (MIME: {}, strength: {})",
magic.message(),
magic.mime_type(),
magic.strength()
);
Ok(())
}
use magic_rs::{MagicDb, MagicSource};
use std::fs::File;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = MagicDb::new();
// Create a MagicSource from a file
let rust_magic = MagicSource::open("../magic-db/src/magdir/rust")?;
db.load(rust_magic)?;
// Open a file and detect its type
let mut file = File::open("src/lib.rs")?;
// Get all matching rules, sorted by strength
let magics = db.magic_all(&mut file)?;
// Must contain rust file magic and default text magic
assert!(magics.len() > 1);
for magic in magics {
println!(
"Match: {} (strength: {}, source: {})",
magic.message(),
magic.strength(),
magic.source().unwrap_or("unknown")
);
}
Ok(())
}
use magic_rs::{MagicDb, MagicSource};
use std::fs::File;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = MagicDb::new();
// Create a MagicSource from a file
let rust_magic = MagicSource::open("../magic-db/src/magdir/rust")?;
db.load(rust_magic)?;
// Serialize the database to a file
let mut output = File::create("/tmp/compiled.db")?;
db.serialize(&mut output)?;
println!("Database saved to file");
Ok(())
}
use magic_rs::{MagicDb, MagicSource};
use std::fs::File;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = MagicDb::new();
// Create a MagicSource from a file
let rust_magic = MagicSource::open("../magic-db/src/magdir/rust")?;
db.load(rust_magic)?;
// Serialize the database in a vector
let mut ser = vec![];
db.serialize(&mut ser)?;
println!("Database saved to vector");
// We deserialize from slice
let db = MagicDb::deserialize(&mut ser.as_slice())?;
assert!(!db.rules().is_empty());
Ok(())
}
This project is licensed under the GPL-3.0 License.
Contributions are welcome! Open an issue or submit a pull request.
libmagic (part of the file command).