DEV Community

Cover image for 🚀 Level Up Your Rust Skills: Master State Management with a Brilliant Tip! 🤓💡
Jimmy McBride
Jimmy McBride

Posted on

🚀 Level Up Your Rust Skills: Master State Management with a Brilliant Tip! 🤓💡

Hey there, Rustaceans! 😄 Today, I'm going to share a fantastic tip for handling states in Rust. This little trick will help you level up your Rust skills and make your code even more elegant!

In Rust, you can define an enum for various application states and associated data like this:

enum CurrentState<'a, T> {
    Loading,
    Success(&'a T),
    Error(&'a str),
}
Enter fullscreen mode Exit fullscreen mode

To create a method that executes different closures for each state, define a trait with a method that takes three closures as arguments:

trait DuringCurrentState<'a, T> {
    fn during_current_state(
        self,
        loading: impl FnOnce() + 'a,
        success: impl FnOnce(&T) + 'a,
        error: impl FnOnce(&str) + 'a,
    );
}

impl<'a, T> DuringCurrentState<'a, T> for CurrentState<'a, T> {
    fn during_current_state(
        self,
        loading: impl FnOnce() + 'a,
        success: impl FnOnce(&T) + 'a,
        error: impl FnOnce(&str) + 'a,
    ) {
        match self {
            CurrentState::Loading => loading(),
            CurrentState::Success(data) => success(data),
            CurrentState::Error(message) => error(message),
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Now, you can call the during_current_state method on an instance of the CurrentState enum and pass closures for the loading, success, and error cases:

let state = CurrentState::Success(&["one".to_owned(), "two".to_owned(), "three".to_owned()][..]);

state.during_current_state(
    || {
        println!("loading...");
    },
    |data| {
        println!("success: {:?}", data);
    },
    |message| {
        println!("error: {:?}", message);
    },
);
Enter fullscreen mode Exit fullscreen mode

And there you have it! This handy trick will make your state management in Rust more elegant and efficient. Try it out in your projects and let me know what you think! 🌟 Don't forget to comment, like, and follow for more amazing Rust tips! 🚀

Top comments (0)