Add structures to store the content of bom file

This commit is contained in:
jiangjianfeng 2021-09-17 14:03:02 +08:00 committed by Zongmin.Gu
parent 6a0435d9b6
commit c172b2be5c

98
tools/copy_bom/src/bom.rs Normal file

@ -0,0 +1,98 @@
//! This file defines data structures to store contents in bom file
//! as well as all management on these strcutures.
//! Structures `Bom`, `Target`, `SymLink`, `Source`, `NormalFile`, `FileWithOption`
//! are used to parse the bom file.
//! Structures ending with `management` are used to define managements on different levels.
//! We will construct a BomManagement for each bom file (the top bom file and all included bom files).
//! Then do real file operations on each BomManagement
use crate::error::{FILE_NOT_EXISTS_ERROR, INVALID_BOM_FILE_ERROR};
use crate::util::{
check_file_hash, copy_dir, copy_file, copy_shared_object, create_link, dest_in_root,
find_dependent_shared_objects, find_included_bom_file, mkdir, resolve_envs,
};
use serde::{Deserialize, Serialize};
use serde_yaml;
use std::collections::{HashSet, VecDeque};
use std::hash::Hash;
use std::path::PathBuf;
use std::slice::Iter;
// The whole bom file
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Bom {
pub includes: Option<Vec<String>>,
pub excludes: Option<Vec<String>>,
targets: Option<Vec<Target>>,
}
// target in a bom file.
// Each target represents the same destination.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Target {
target: String,
mkdirs: Option<Vec<String>>,
createlinks: Option<Vec<SymLink>>,
copy: Option<Vec<Source>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SymLink {
src: String,
linkname: String,
}
// source in a target.
// each Source has the same `from` directory.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Source {
from: Option<String>,
dirs: Option<Vec<String>>,
files: Option<Vec<NormalFile>>,
}
// A file need to be copied
// It can be only a filename; or file with multiple options to enable checking hash, renaming file, etc.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum NormalFile {
FileName(String),
FileWithOption(FileWithOption),
}
// A file with multiple optional options
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct FileWithOption {
name: String,
hash: Option<String>,
autodep: Option<bool>,
rename: Option<String>,
}
/// all operations defined for one bom file
#[derive(Default)]
pub struct BomManagement {
dirs_to_make: Vec<String>,
links_to_create: Vec<(String, String)>,
dirs_to_copy: Vec<(String, String)>,
files_to_copy: Vec<(String, String)>,
shared_objects_to_copy: Vec<(String, String)>,
}
/// all operations defined for one target
#[derive(Default)]
pub struct TargetManagement {
dirs_to_make: Vec<String>,
links_to_create: Vec<(String, String)>,
dirs_to_copy: Vec<(String, String)>,
files_to_copy: Vec<(String, String)>,
files_autodep: Vec<String>,
}
/// all operations defined for one source
#[derive(Default)]
pub struct SourceManagement {
dirs_to_copy: Vec<(String, String)>,
files_to_copy: Vec<(String, String)>,
files_autodep: Vec<String>,
}