Skip to main content

nom_kconfig/entry/source/
source.rs

1use nom::{branch::alt, bytes::complete::tag, sequence::delimited, IResult, Parser};
2#[cfg(feature = "deserialize")]
3use serde::Deserialize;
4#[cfg(feature = "serialize")]
5use serde::Serialize;
6
7#[cfg(feature = "glob-wildcard")]
8use crate::entry::source::{expand_source_files, JoinPathMode};
9use crate::{
10    entry::source::{parse_filepath, parse_source_kconfig},
11    kconfig::Kconfig,
12    util::{ws, wsi},
13    KconfigInput,
14};
15
16/// Entry that reads the specified configuration file. This file is always parsed.
17#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "hash", derive(Hash))]
19#[cfg_attr(feature = "serialize", derive(Serialize))]
20#[cfg_attr(feature = "deserialize", derive(Deserialize))]
21pub struct Source {
22    pub kconfigs: Vec<Kconfig>,
23}
24
25pub fn parse_source(input: KconfigInput) -> IResult<KconfigInput, Source> {
26    let (input, _) = ws(tag("source")).parse(input)?;
27    let (mut input, file) = wsi(alt((
28        delimited(tag("\""), parse_filepath, tag("\"")),
29        parse_filepath,
30    )))
31    .parse(input)?;
32
33    #[cfg(feature = "glob-wildcard")]
34    {
35        let expanded_files = expand_source_files(input.clone(), file, JoinPathMode::Root)?;
36        let mut sources = vec![];
37
38        for expanded_file in expanded_files {
39            let source_kconfig_file = input.extra.new_source_file(expanded_file);
40            let (variables, source) = parse_source_kconfig(input.clone(), source_kconfig_file)?;
41            input.extra.add_local_vars(variables);
42            sources.push(source);
43        }
44
45        Ok((input, Source { kconfigs: sources }))
46    }
47
48    #[cfg(not(feature = "glob-wildcard"))]
49    {
50        use std::path::PathBuf;
51
52        let source_kconfig_file = input.extra.new_source_file(PathBuf::from(file));
53        let (variables, source) = parse_source_kconfig(input.clone(), source_kconfig_file)?;
54        input.extra.add_local_vars(variables);
55        return Ok((
56            input,
57            Source {
58                kconfigs: vec![source],
59            },
60        ));
61    }
62}