Some more woogaloo around action dispatch
Co-authored-by: Conrad <conrad@zed.dev>
This commit is contained in:
parent
194d615691
commit
a1d9f351db
3 changed files with 54 additions and 10 deletions
|
@ -114,6 +114,7 @@ lazy_static! {
|
|||
#[derive(Default)]
|
||||
struct ActionRegistry {
|
||||
builders_by_name: HashMap<SharedString, ActionBuilder>,
|
||||
builders_by_type_id: HashMap<TypeId, ActionBuilder>,
|
||||
all_names: Vec<SharedString>, // So we can return a static slice.
|
||||
}
|
||||
|
||||
|
@ -122,9 +123,22 @@ pub fn register_action<A: Action>() {
|
|||
let name = A::qualified_name();
|
||||
let mut lock = ACTION_REGISTRY.write();
|
||||
lock.builders_by_name.insert(name.clone(), A::build);
|
||||
lock.builders_by_type_id.insert(TypeId::of::<A>(), A::build);
|
||||
lock.all_names.push(name);
|
||||
}
|
||||
|
||||
/// Construct an action based on its name and optional JSON parameters sourced from the keymap.
|
||||
pub fn build_action_from_type(type_id: &TypeId) -> Result<Box<dyn Action>> {
|
||||
let lock = ACTION_REGISTRY.read();
|
||||
|
||||
let build_action = lock
|
||||
.builders_by_type_id
|
||||
.get(type_id)
|
||||
.ok_or_else(|| anyhow!("no action type registered for {:?}", type_id))?;
|
||||
|
||||
(build_action)(None)
|
||||
}
|
||||
|
||||
/// Construct an action based on its name and optional JSON parameters sourced from the keymap.
|
||||
pub fn build_action(name: &str, params: Option<serde_json::Value>) -> Result<Box<dyn Action>> {
|
||||
let lock = ACTION_REGISTRY.read();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue