Proper error handling is essential for secure smart contracts. Let's learn how to define and use custom errors in Stylus.
## Your Task
Create a contract that:
1. Defines custom error types using `sol!` macro
2. Returns errors when conditions aren't met
3. Validates input before processing
## Key Concepts
- Define errors with `error ErrorName(params)`
- Use `Result<T, E>` return types
- Revert with meaningful error messages