1use std::{
4 fs::{File, create_dir_all},
5 io::{self, IsTerminal, Write},
6 path::PathBuf,
7};
8
9use alpm_common::MetadataFile;
10
11use crate::{
12 Error,
13 PackageInfo,
14 PackageInfoSchema,
15 PackageInfoV1,
16 PackageInfoV2,
17 cli::{CreateCommand, OutputFormat},
18};
19
20pub fn create_file(command: CreateCommand) -> Result<(), Error> {
27 let (data, output) = match command {
28 CreateCommand::V1 { args } => (
29 PackageInfoV1::new(
30 args.pkgname,
31 args.pkgbase,
32 args.pkgver,
33 args.pkgdesc,
34 args.url,
35 args.builddate,
36 args.packager,
37 args.size,
38 args.arch,
39 args.license,
40 args.replaces,
41 args.group,
42 args.conflict,
43 args.provides,
44 args.backup,
45 args.depend,
46 args.optdepend,
47 args.makedepend,
48 args.checkdepend,
49 )
50 .to_string(),
51 args.output,
52 ),
53 CreateCommand::V2 { args, xdata } => (
54 PackageInfoV2::new(
55 args.pkgname,
56 args.pkgbase,
57 args.pkgver,
58 args.pkgdesc,
59 args.url,
60 args.builddate,
61 args.packager,
62 args.size,
63 args.arch,
64 args.license,
65 args.replaces,
66 args.group,
67 args.conflict,
68 args.provides,
69 args.backup,
70 args.depend,
71 args.optdepend,
72 args.makedepend,
73 args.checkdepend,
74 xdata,
75 )?
76 .to_string(),
77 args.output,
78 ),
79 };
80
81 if let Some(output_dir) = output.0.parent() {
83 create_dir_all(output_dir).map_err(|e| {
84 Error::IoPathError(output_dir.to_path_buf(), "creating output directory", e)
85 })?;
86 }
87
88 let mut out = File::create(&output.0)
89 .map_err(|e| Error::IoPathError(output.0.clone(), "creating output file", e))?;
90
91 let _ = out
92 .write(data.as_bytes())
93 .map_err(|e| Error::IoPathError(output.0, "writing to output file", e))?;
94
95 Ok(())
96}
97
98pub fn parse(
112 file: Option<PathBuf>,
113 schema: Option<PackageInfoSchema>,
114) -> Result<PackageInfo, Error> {
115 if let Some(file) = file {
116 PackageInfo::from_file_with_schema(file, schema)
117 } else if !io::stdin().is_terminal() {
118 PackageInfo::from_stdin_with_schema(schema)
119 } else {
120 Err(Error::NoInputFile)
121 }
122}
123
124pub fn validate(file: Option<PathBuf>, schema: Option<PackageInfoSchema>) -> Result<(), Error> {
132 let _ = parse(file, schema)?;
133 Ok(())
134}
135
136pub fn format(
147 file: Option<PathBuf>,
148 schema: Option<PackageInfoSchema>,
149 output_format: OutputFormat,
150 pretty: bool,
151) -> Result<(), Error> {
152 let pkg_info = parse(file, schema)?;
153 match output_format {
154 OutputFormat::Json => {
155 println!(
156 "{}",
157 if pretty {
158 serde_json::to_string_pretty(&pkg_info)?
159 } else {
160 serde_json::to_string(&pkg_info)?
161 }
162 );
163 }
164 }
165 Ok(())
166}