Use strong typing and early validation to handle optional values and prevent null-related issues. Prefer enums and specific types over strings when dealing with optional data, and validate optional values as early as possible in the data flow.
Key practices:
Example:
```rust
// Instead of
struct Config {
kind: String, // Could be “realm” or “index”
value: Option
// Prefer
enum ConfigKind {
Realm(String),
Index(String)
}
struct Config {
kind: ConfigKind,
value: Option
// Use bool::then for cleaner optional handling let value = condition.then(|| compute_value());
// Validate optional data early fn get_project_version(doc: &mut Document) -> Result<Version, Error> { let project = doc.get(“project”) .ok_or(Error::MissingProject)?;
let version = project
.get("version")
.and_then(Item::as_value)
.and_then(Value::as_str)
.ok_or(Error::MissingVersion)?;
Version::from_str(version) }
Enter the URL of a public GitHub repository