███████╗ █████╗ ██╗ ██╗ █████╗ ████████╗
╚══███╔╝██╔══██╗██║ ██╔╝██╔══██╗╚══██╔══╝
███╔╝ ███████║█████╔╝ ███████║ ██║
███╔╝ ██╔══██║██╔═██╗ ██╔══██║ ██║
███████╗██║ ██║██║ ██╗██║ ██║ ██║
╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝
Zakat

Rust library for Islamic Zakat calculation. Uses rust_decimal for precision.
Features
- Gold, Silver, Business, Agriculture, Livestock, Mining & Rikaz
- Stocks, Mutual Funds, Crypto (as liquid assets)
- Professional Income (Gross/Net)
- Zakat Fitrah
- Configurable Nisab thresholds
- Portfolio aggregation
- Asset Labeling (e.g., "Main Store", "Crypto Wallet")
- Input Sanitization (Rejects negative values)
Install
[dependencies]
zakat = "0.1.3"
rust_decimal = "1.39"
rust_decimal_macros = "1.39"
Usage
Business Zakat
use zakat::{ZakatConfig, CalculateZakat};
use zakat::maal::business::{BusinessAssets, BusinessZakatCalculator};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ZakatConfig::new(65, 1);
let assets = BusinessAssets::new(
50000, 20000, 5000, 1000 )?;
let calc = BusinessZakatCalculator::new(assets, &config)?
.with_label("Main Store")
.with_hawl(true)
.with_debt(1000);
let result = calc.calculate_zakat()?;
if result.is_payable {
println!("Zakat for {}: ${}", result.label.unwrap_or_default(), result.zakat_due);
}
Ok(())
}
Portfolio
use zakat::{ZakatConfig, ZakatPortfolio, WealthType};
use zakat::maal::precious_metals::PreciousMetal;
use zakat::maal::investments::{InvestmentAssets, InvestmentType};
use zakat::maal::income::{IncomeZakatCalculator, IncomeCalculationMethod};
use rust_decimal_macros::dec;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ZakatConfig::new(65, 1);
let portfolio = ZakatPortfolio::new()
.add_calculator(IncomeZakatCalculator::new(
5000, 0, IncomeCalculationMethod::Gross, &config
)?.with_label("Monthly Salary"))
.add_calculator(PreciousMetal::new(
100, WealthType::Gold, &config
)?.with_label("Wife's Gold"))
.add_calculator(InvestmentAssets::new(
20000, InvestmentType::Crypto, &config
)?.with_debt(dec!(2000.0)).with_label("Binance Portfolio"));
let result = portfolio.calculate_total(&config)?;
println!("Total Zakat Due: ${}", result.total_zakat_due);
for detail in result.details {
if let Some(label) = detail.label {
println!(" - {}: ${}", label, detail.zakat_due);
}
}
Ok(())
}
Custom Nisab
use zakat::ZakatConfig;
let config = ZakatConfig::new(65, 1)
.with_gold_nisab(87)
.with_agriculture_nisab(700);
Modules
| Module |
Nisab |
maal::precious_metals |
85g Gold / 595g Silver |
maal::business |
85g Gold |
maal::income |
85g Gold |
maal::investments |
85g Gold |
maal::agriculture |
653 kg |
maal::livestock |
Count-based |
maal::mining |
Rikaz: None / Mines: 85g Gold |
fitrah |
N/A |
Contributing
- Add tests
- Use
rust_decimal
- Run
cargo test
Support

"Those who spend their wealth in the cause of Allah..." — Al-Baqarah 2:262
License
MIT