serde-xml-rs 0.8.2

xml-rs based deserializer for Serde (compatible with 1.0)
Documentation
use serde::{Deserialize, Serialize};
use serde_xml_rs::from_str;

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct PlateAppearance(Vec<Event>);

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "kebab-case")]
enum Event {
    Pitch(Pitch),
    Runner(Runner),
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Pitch {
    #[serde(rename = "@speed")]
    speed: u32,
    #[serde(rename = "@type")]
    r#type: PitchType,
    #[serde(rename = "@outcome")]
    outcome: PitchOutcome,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum PitchType {
    FourSeam,
    TwoSeam,
    Changeup,
    Cutter,
    Curve,
    Slider,
    Knuckle,
    Pitchout,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum PitchOutcome {
    Ball,
    Strike,
    Hit,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Runner {
    #[serde(rename = "@from")]
    from: Base,
    #[serde(rename = "@to")]
    to: Option<Base>,
    #[serde(rename = "@outcome")]
    outcome: RunnerOutcome,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum Base {
    First,
    Second,
    Third,
    Home,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum RunnerOutcome {
    Steal,
    Caught,
    PickOff,
}

#[test]
fn main() {
    let document = r#"
        <plate-appearance>
          <pitch speed="95" type="FourSeam" outcome="Ball" />
          <pitch speed="91" type="FourSeam" outcome="Strike" />
          <pitch speed="85" type="Changeup" outcome="Ball" />
          <runner from="First" to="Second" outcome="Steal" />
          <pitch speed="89" type="Slider" outcome="Strike" />
          <pitch speed="88" type="Curve" outcome="Hit" />
        </plate-appearance>"#;
    let plate_appearance: PlateAppearance = from_str(document).unwrap();
    assert_eq!(
        plate_appearance.0[0],
        Event::Pitch(Pitch {
            speed: 95,
            r#type: PitchType::FourSeam,
            outcome: PitchOutcome::Ball
        })
    );
}