starlane_core/resource/
create_args.rs

1use std::fs::File;
2use std::io::{Read, Write};
3
4use std::str::FromStr;
5
6use zip::write::FileOptions;
7use zip::{CompressionMethod, ZipWriter};
8
9use crate::error::Error;
10use crate::resource::{ResourceAddress,ResourceType,ResourceKind};
11use std::convert::TryInto;
12use starlane_resources::ResourcePath;
13
14lazy_static! {
15    pub static ref ARTIFACT_BUNDLE: ResourcePath = artifact_bundle_address();
16    pub static ref SPACE: &'static str = r#"
17name: Space
18args:
19    - display-name:
20        about: Takes a human friendly display name
21        required: true
22   "#;
23    pub static ref SUB_SPACE: &'static str = r#"
24name: SubSpace
25args:
26    - display-name:
27        about: Takes a human friendly display name
28        required: true
29   "#;
30}
31
32pub fn artifact_bundle_address() -> ResourcePath {
33    let address = format!("space:core:{}", crate::VERSION.to_string());
34    ResourcePath::from_str(address.as_str()).expect(
35        format!(
36            "FATAL: expected artifact_bundle_address '{}' to be parse-able",
37            address
38        )
39        .as_str(),
40    )
41}
42
43pub fn space_address() -> Result<ResourcePath,Error> {
44   let path  = artifact_bundle_address();
45   let address = path.append("/create-args/space.yaml" )?;
46   Ok(address)
47}
48
49
50pub fn create_args_artifact_bundle() -> Result<Vec<u8>, Error> {
51    let zipfile = tempfile::NamedTempFile::new()?;
52    let mut zip = ZipWriter::new(zipfile.reopen()?);
53
54    write_file_to_zip(&mut zip, "create-args/space.yaml", &SPACE)?;
55    write_file_to_zip(&mut zip, "create-args/sub_space.yaml", &SUB_SPACE)?;
56
57    zip.finish()?;
58
59    let mut file = zipfile.reopen()?;
60
61    let mut data = Vec::with_capacity(file.metadata()?.len() as _);
62    file.read_to_end(&mut data)?;
63
64    Ok(data)
65}
66
67fn write_file_to_zip(zip: &mut ZipWriter<File>, filename: &str, data: &str) -> Result<(), Error> {
68    let file_options = FileOptions::default()
69        .compression_method(CompressionMethod::Deflated)
70        .unix_permissions(0o755);
71
72    zip.start_file(filename, file_options)?;
73    zip.write_all(data.as_bytes())?;
74
75    Ok(())
76}