sdp_nom/lib.rs
1//! # Nom based SDP parser
2//!
3//!
4//! ## Implementation status:
5//! * [x] [Protocol Version](https://tools.ietf.org/html/rfc4566#section-5.1) (`"v="`) [`u32`]
6//! * [x] [Origin](https://tools.ietf.org/html/rfc4566#section-5.2) (`"o="`) [`Origin`][`crate::lines::origin::Origin`]
7//! * [x] [Session Name](https://tools.ietf.org/html/rfc4566#section-5.3) (`"s="`) [`SessionName`][`crate::lines::session_name::SessionName`]
8//! * [x] [Session Information](https://tools.ietf.org/html/rfc4566#section-5.4) (`"i="`) [`SessionInformation`][`crate::lines::session_information::SessionInformation`]
9//! * [x] [URI](https://tools.ietf.org/html/rfc4566#section-5.5) (`"u="`) [`Uri`][`crate::lines::uri::Uri`]
10//! * [x] [Email Address and Phone Number](https://tools.ietf.org/html/rfc4566#section-5.6) (`"e="` and `"p="`) [`EmailAddress`][`crate::lines::email::EmailAddress`] [`PhoneNumber`][`crate::lines::phone_number::PhoneNumber`]
11//! * [x] [Connection Data](https://tools.ietf.org/html/rfc4566#section-5.7) (`"c="`) [`Connection`][`crate::lines::connection::Connection`]
12//! * [x] [Bandwidth](https://tools.ietf.org/html/rfc4566#section-5.8) (`"b="`) [`BandWidth`][`crate::lines::bandwidth::BandWidth`]
13//! * [x] [Timing](https://tools.ietf.org/html/rfc4566#section-5.9) (`"t="`) [`Timing`][`crate::lines::timing::Timing`]
14//! * [ ] [Repeat Times](https://tools.ietf.org/html/rfc4566#section-5.10) (`"r="`)
15//! * [ ] [Time Zones](https://tools.ietf.org/html/rfc4566#section-5.11) (`"z="`)
16//! * [ ] [Encryption Keys](https://tools.ietf.org/html/rfc4566#section-5.12) (`"k="`)
17//! * [x] [Attributes](https://tools.ietf.org/html/rfc4566#section-5.13) (`"a="`)
18//! * [x] [Media Descriptions](https://tools.ietf.org/html/rfc4566#section-5.14) (`"m="`) [`Media`][`crate::lines::media::Media`]
19//! * [x] [SDP Attributes](https://tools.ietf.org/html/rfc4566#section-6.0)
20
21#![deny(
22 trivial_casts,
23 trivial_numeric_casts,
24 unsafe_code,
25 unused_import_braces,
26 clippy::clone_on_copy
27)]
28// #![warn(missing_docs)]
29
30#[cfg_attr(feature = "wee_alloc", global_allocator)]
31#[cfg(feature = "wee_alloc")]
32static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
33
34pub mod attributes;
35pub mod lines;
36mod sdp_line;
37
38pub mod media_section;
39pub mod session;
40
41mod parsers;
42#[cfg(test)]
43mod tests;
44
45#[cfg(test)]
46#[macro_use]
47mod assert;
48
49#[cfg(feature = "ufmt")]
50mod udisplay;
51
52pub use crate::{
53 sdp_line::{sdp_line, SdpLine},
54 session::Session,
55};
56
57#[cfg(feature = "ufmt")]
58pub use crate::session::ufmt_to_string;
59
60pub fn sdp_lines(sdp: &str) -> impl Iterator<Item = SdpLine<'_>> {
61 sdp.lines().filter_map(|line| match sdp_line(line) {
62 Ok((_, parsed)) => Some(parsed),
63 Err(_) => None,
64 })
65}
66
67pub fn sdp_lines_all(sdp: &str) -> impl Iterator<Item = Result<(&str, SdpLine<'_>), String>> {
68 sdp.lines()
69 .map(|l| nom::Finish::finish(sdp_line(l)).map_err(|e| e.to_string()))
70}