use rosc::OscMessage;
use super::args::{parse_curve_id, parse_f32, parse_i32, parse_optional_uuid};
use crate::action::UiAction;
use crate::storage::asset::animation::Animation;
use crate::storage::asset::project::scene_instance_path::SceneInstanceUnion;
use crate::storage::asset_id::AssetId;
pub(super) fn parse_target_effect_action(
msg: &OscMessage,
target: SceneInstanceUnion,
effect_index: usize,
action: &str,
) -> Result<UiAction, ()> {
match action {
"opacity" => Ok(UiAction::SetSceneEffectOpacity(
target,
effect_index,
parse_f32(msg, 0)?,
)),
"color_shift" => Ok(UiAction::SetSceneEffectColorShift(
target,
effect_index,
parse_f32(msg, 0)?,
)),
"beat_progression" => Ok(UiAction::SetSceneEffectBeatProgression(
target,
effect_index,
parse_f32(msg, 0)?,
)),
"beat_offset" => Ok(UiAction::SetSceneEffectBeatOffset(
target,
effect_index,
parse_f32(msg, 0)?,
)),
"speed_exponent" => Ok(UiAction::SetSceneEffectSpeedExponent(
target,
effect_index,
parse_i32(msg, 0)?,
)),
"layout" => Ok(UiAction::SetSceneEffectLayout(
target,
effect_index,
usize::try_from(parse_i32(msg, 0)?).ok(),
)),
"animation" => Ok(UiAction::SetSceneEffectAnimation(
target,
effect_index,
parse_optional_animation_id(msg, 0)?,
)),
"delete" => Ok(UiAction::RemoveSceneEffect(target, effect_index)),
"clone" => Ok(UiAction::CloneSceneEffect(target, effect_index)),
_ => Err(()),
}
}
fn parse_optional_animation_id(
msg: &OscMessage,
index: usize,
) -> Result<Option<AssetId<Animation>>, ()> {
parse_optional_uuid(msg, index).map(|id| id.map(AssetId::from_uuid))
}
pub(super) fn parse_target_effect_curve_action(
msg: &OscMessage,
target: SceneInstanceUnion,
effect_index: usize,
field: &str,
sub_action: &str,
) -> Result<UiAction, ()> {
match (field, sub_action) {
("opacity", "value") => Ok(UiAction::SetSceneEffectOpacityMultiplier(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("opacity", "static") => Ok(UiAction::SetSceneEffectOpacity(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("opacity", "curve") => Ok(UiAction::SetSceneEffectOpacityCurve(
target,
effect_index,
parse_curve_id(msg, 0)?,
)),
("color_shift", "value") => Ok(UiAction::SetSceneEffectColorShiftMultiplier(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("color_shift", "static") => Ok(UiAction::SetSceneEffectColorShift(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("color_shift", "curve") => Ok(UiAction::SetSceneEffectColorShiftCurve(
target,
effect_index,
parse_curve_id(msg, 0)?,
)),
("beat_progression", "value") => Ok(UiAction::SetSceneEffectBeatProgressionMultiplier(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("beat_progression", "static") => Ok(UiAction::SetSceneEffectBeatProgression(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("beat_progression", "curve") => Ok(UiAction::SetSceneEffectBeatProgressionCurve(
target,
effect_index,
parse_curve_id(msg, 0)?,
)),
("beat_offset", "value") => Ok(UiAction::SetSceneEffectBeatOffsetMultiplier(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("beat_offset", "static") => Ok(UiAction::SetSceneEffectBeatOffset(
target,
effect_index,
parse_f32(msg, 0)?,
)),
("beat_offset", "curve") => Ok(UiAction::SetSceneEffectBeatOffsetCurve(
target,
effect_index,
parse_curve_id(msg, 0)?,
)),
_ => Err(()),
}
}