nom_pdb/title_section/expdta.rs
1// Copyright (c) 2020 Tianyi Shi
2//
3// This software is released under the MIT License.
4// https://opensource.org/licenses/MIT
5
6//! Parses EXPDTA records which is a continuation type of record which may span multi-lines.
7//! Record contains list of `;` seperated experimental techniques. If seuccesfull returns
8//! [Record](../ast/types/enum.Record.html) variant containing
9//! [ExperimentalTechniques](../ast/types/struct.Experimental.html)
10//!
11//! # Record structure
12//!
13//! | COLUMNS | DATA TYPE | FIELD | DEFINITION |
14//! |---------|---------------|--------------|-------------------------------------------|
15//! | 1 - 6 | Record name | EXPDTA | |
16//! | 9 - 10 | Continuation | continuation | Allows concatenation of multiple records. |
17//! | 11 - 79 | SList | technique | The experimental technique(s) with |
18//! | | | optional comment desc |
19use crate::common::parser::{parse_multiline_list, FieldParser};
20use crate::types::*;
21
22pub struct ExperimentalTechniquesParser;
23impl FieldParser for ExperimentalTechniquesParser {
24 type Output = Vec<ExperimentalTechnique>;
25 fn parse(inp: &[u8]) -> nom::IResult<&[u8], Vec<ExperimentalTechnique>> {
26 let (inp, techniques_as_str) = parse_multiline_list(inp)?;
27 let techniques: Vec<ExperimentalTechnique> = techniques_as_str
28 .into_iter()
29 .map(|s| {
30 s.parse::<ExperimentalTechnique>()
31 .expect("Failed to parse experimental techniques")
32 })
33 .collect();
34 Ok((inp, techniques))
35 }
36}