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}