مكتبة config لإدارة التكوين في Rust
عند تطوير التطبيقات بلغة Rust، تعتبر إدارة الإعدادات بمرونة مهمة أساسية. توفر مكتبة config (الـ crate config) طريقة قوية ومريحة للعمل مع ملفات التكوين ومتغيرات البيئة والقيم المضمنة. تدعم التنسيقات TOML وJSON وYAML وHJSON وINI وتسمح بدمج الإعدادات من مصادر متعددة مع أولويات.
التثبيت
أضف التبعية في Cargo.toml:
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }الاستخدام الأساسي
لننشئ ملف تكوين بسيط Settings.toml:
[server]host = "127.0.0.1"port = 8080
[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10الآن لنقم بتحميله في تطبيق Rust:
use config::{Config, File, Environment};use serde::Deserialize;
#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16,}
#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}
#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}
fn main() -> Result<(), config::ConfigError> { let settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP")) .build()?;
let app_config: AppConfig = settings.try_deserialize()?; println!("الخادم: {}:{}", app_config.server.host, app_config.server.port); println!("قاعدة البيانات: {}", app_config.database.url); Ok(())}دعم التنسيقات المتعددة
تحدد المكتبة التنسيق تلقائياً من امتداد الملف. مثال مع JSON:
let settings = Config::builder() .add_source(File::with_name("config.json")) .add_source(File::with_name("override.yaml").required(false)) .build()?;متغيرات البيئة
استخدم بادئة لمتغيرات البيئة لتجاوز الإعدادات دون تعديل الملفات:
// التشغيل: APP_SERVER__PORT=9090 cargo runlet settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP").separator("__")) .build()?;الإعدادات المتداخلة والمصفوفات
يتم دعم الهياكل الهرمية:
#[derive(Debug, Deserialize)]struct AppConfig { features: Vec<String>, logging: LoggingConfig,}
#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}مثال TOML مع مصفوفات:
features = ["auth", "caching", "metrics"]
[logging]level = "info"file = "/var/log/app.log"دمج التكوينات
تسمح المكتبة بتراكب الإعدادات من مصادر مختلفة. المصادر المتأخرة لها أولوية أعلى:
let settings = Config::builder() .add_source(File::with_name("default")) // الإعدادات الأساسية .add_source(File::with_name("production").required(false)) // الإنتاج .add_source(Environment::with_prefix("APP")) // متغيرات البيئة .build()?;معالجة الأخطاء والقيم الافتراضية
استخدم get() للحصول على قيم فردية مع قيمة احتياطية:
let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);الوصول الديناميكي للإعدادات
إذا كان هيكل التكوين غير معروف مسبقاً، استخدم الوصول الديناميكي:
let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout")