dotfiles_actions/apt/
directive.rs1extern crate strict_yaml_rust;
24
25use crate::apt::action::AptAction;
26use dotfiles_core::action::ActionParser;
27use dotfiles_core::action::SKIP_IN_CI_SETTING;
28use dotfiles_core::directive::DirectiveData;
29use dotfiles_core::error::add_directive_error_prefix;
30use dotfiles_core::error::DotfilesError;
31use dotfiles_core::settings::initialize_settings_object;
32use dotfiles_core::settings::Setting;
33use dotfiles_core::settings::Settings;
34use dotfiles_core::yaml_util::*;
35use dotfiles_core_macros::Directive;
36
37use std::marker::PhantomData;
38use std::path::Path;
39use strict_yaml_rust::StrictYaml;
40pub const DIRECTIVE_NAME: &str = "apt";
42
43pub const PACKAGE_SETTING: &str = "package";
45
46pub fn init_directive_data() -> DirectiveData {
48  DirectiveData::from(
49    DIRECTIVE_NAME.into(),
50    initialize_settings_object(&[(SKIP_IN_CI_SETTING.to_owned(), Setting::Boolean(false))]),
51  )
52}
53
54#[derive(Directive, Clone)]
56pub struct AptDirective<'a> {
57  data: DirectiveData,
58  phantom_data: PhantomData<&'a DirectiveData>,
59}
60
61impl<'a> Default for AptDirective<'a> {
62  fn default() -> AptDirective<'a> {
63    AptDirective::<'a> {
64      data: init_directive_data(),
65      phantom_data: PhantomData,
66    }
67  }
68}
69
70impl<'a> ActionParser<'a> for AptDirective<'a> {
71  type ActionType = AptAction<'a>;
72
73  fn parse_action(
74    &'a self,
75    context_settings: &Settings,
76    yaml: &StrictYaml,
77    _: &Path,
78  ) -> Result<AptAction<'a>, DotfilesError> {
79    let skip_in_ci = get_boolean_setting_from_yaml_or_context(
80      SKIP_IN_CI_SETTING,
81      yaml,
82      context_settings,
83      self.data.defaults(),
84    )?;
85    let packages = get_optional_string_array_from_yaml_hash(PACKAGE_SETTING, yaml)?;
86    Ok(AptAction::new(skip_in_ci, packages))
87  }
88
89  fn parse_action_list(
92    &'a self,
93    context_settings: &Settings,
94    yaml: &StrictYaml,
95    current_dir: &Path,
96  ) -> Result<Vec<AptAction<'a>>, DotfilesError> {
97    Ok(vec![add_directive_error_prefix(
98      self,
99      self.parse_action(context_settings, yaml, current_dir),
100    )?])
101  }
102}