soma/problem/configs/
binary.rs

1use std::path::{Path, PathBuf};
2
3use serde::{Deserialize, Serialize};
4
5use super::common::{FileEntry, FilePermissions, SolidFileEntry};
6use crate::prelude::*;
7
8#[derive(Deserialize)]
9pub struct BinaryConfig {
10    os: String,
11    cmd: String,
12    executable: Vec<FileEntry>,
13    readonly: Vec<FileEntry>,
14}
15
16#[derive(Serialize)]
17pub struct SolidBinaryConfig {
18    os: String,
19    cmd: String,
20    file_entries: Vec<SolidFileEntry>,
21}
22
23impl BinaryConfig {
24    pub fn executable(&self) -> &Vec<FileEntry> {
25        &self.executable
26    }
27
28    pub fn readonly(&self) -> &Vec<FileEntry> {
29        &self.readonly
30    }
31
32    pub fn solidify(&self, work_dir: impl AsRef<Path>) -> SomaResult<SolidBinaryConfig> {
33        let executable = self
34            .executable
35            .iter()
36            .map(|file| file.solidify(&work_dir, FilePermissions::Executable));
37        let readonly = self
38            .readonly
39            .iter()
40            .map(|file| file.solidify(&work_dir, FilePermissions::ReadOnly));
41        let file_entries = executable.chain(readonly).collect::<SomaResult<Vec<_>>>()?;
42
43        Ok(SolidBinaryConfig {
44            os: self.os.clone(),
45            cmd: self.cmd.clone(),
46            file_entries,
47        })
48    }
49}
50
51impl SolidBinaryConfig {
52    pub fn path_maps(&self) -> impl Iterator<Item = (&PathBuf, &PathBuf)> + '_ {
53        self.file_entries.iter().map(SolidFileEntry::path_map)
54    }
55}