Skip to content

Commit 2ed8945

Browse files
committed
Move commands to separate files
1 parent e1b21a3 commit 2ed8945

File tree

5 files changed

+140
-98
lines changed

5 files changed

+140
-98
lines changed

src/commands.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
mod add;
2+
mod export;
3+
mod init;
4+
5+
pub use add::add;
6+
pub use export::export;
7+
pub use init::init;

src/commands/add.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use anyhow::Result;
2+
use std::fs;
3+
use toml_edit::{DocumentMut, InlineTable};
4+
5+
use crate::{manifest::Manifest, modrinth::Client, ProjectType};
6+
7+
pub async fn add(client: &Client, projects: Vec<String>, project_type: ProjectType) -> Result<()> {
8+
let manifest_src = fs::read_to_string("podzol.toml")?;
9+
let mut document: DocumentMut = manifest_src.parse()?;
10+
let manifest: Manifest = toml_edit::de::from_document(document.clone())?;
11+
12+
for name in projects {
13+
let project = client.get_project(&name).await?;
14+
15+
let versions = client
16+
.get_project_versions(
17+
&name,
18+
&manifest.enviroment.minecraft,
19+
&manifest.enviroment.loaders,
20+
)
21+
.await?;
22+
23+
// FIXME: use a proper strategy to choose
24+
let version = &versions[0];
25+
let version_number = &version.version_number;
26+
27+
let mut mod_table = InlineTable::new();
28+
mod_table.insert("version", version_number.into());
29+
mod_table.insert("side", project.get_side().to_string().into());
30+
document[project_type.as_table()][&name] = mod_table.into();
31+
32+
println!(
33+
"Added {name} {version_number} to {}",
34+
project_type.as_table()
35+
);
36+
}
37+
38+
fs::write("podzol.toml", document.to_string())?;
39+
40+
Ok(())
41+
}

src/commands/export.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::fs;
2+
3+
use anyhow::Result;
4+
use async_zip::base::write::ZipFileWriter;
5+
use tokio::fs::File;
6+
7+
use crate::{manifest::Manifest, modrinth::Client};
8+
9+
pub async fn export(client: &Client) -> Result<()> {
10+
let manifest: Manifest = toml_edit::de::from_slice(&fs::read("podzol.toml")?)?;
11+
12+
let mut writer = ZipFileWriter::with_tokio(
13+
File::create(format!(
14+
"{}-{}.mrpack",
15+
manifest.pack.name, manifest.pack.version
16+
))
17+
.await?,
18+
);
19+
20+
manifest.build_mrpack(&client, &mut writer).await?;
21+
22+
writer.close().await?;
23+
24+
Ok(())
25+
}

src/commands/init.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use anyhow::{anyhow, Result};
2+
use std::{collections::HashMap, env::current_dir, fs};
3+
4+
use crate::{
5+
manifest::{self, Manifest},
6+
modrinth::{Client, VersionType},
7+
};
8+
9+
pub async fn init(client: &Client, version: Option<String>, name: Option<String>) -> Result<()> {
10+
let current_dir = current_dir().expect("Failed to get current directory");
11+
12+
let name = if let Some(name) = name {
13+
name
14+
} else {
15+
// TODO: some degree of error handling I guess
16+
current_dir
17+
.file_name()
18+
.and_then(|name| name.to_str())
19+
.unwrap_or("pack")
20+
.to_string()
21+
};
22+
23+
let minecraft_version = if let Some(version) = version {
24+
version
25+
} else {
26+
let versions = client.get_game_versions().await?;
27+
28+
let latest_version = versions
29+
.into_iter()
30+
.filter(|version| matches!(version.version_type, VersionType::Release))
31+
.max_by_key(|version| version.date)
32+
.ok_or(anyhow!("No valid Minecraft versions found"))?;
33+
34+
latest_version.version
35+
};
36+
37+
let manifest = Manifest {
38+
pack: manifest::Pack {
39+
name,
40+
version: "0.1.0".to_string(),
41+
description: None,
42+
},
43+
enviroment: manifest::Enviroment {
44+
minecraft: minecraft_version,
45+
loaders: HashMap::new(),
46+
},
47+
files: HashMap::new(),
48+
mods: HashMap::new(),
49+
resource_packs: HashMap::new(),
50+
shaders: HashMap::new(),
51+
};
52+
53+
fs::write("podzol.toml", &toml_edit::ser::to_string_pretty(&manifest)?)?;
54+
55+
git2::Repository::init(current_dir)?;
56+
57+
Ok(())
58+
}

src/main.rs

Lines changed: 9 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
use std::{collections::HashMap, env::current_dir, fmt::Display, fs, str::FromStr};
1+
use std::{fmt::Display, str::FromStr};
22

3-
use anyhow::{anyhow, Result};
4-
use async_zip::base::write::ZipFileWriter;
3+
use anyhow::Result;
54
use clap::{Parser, Subcommand};
6-
use tokio::fs::File;
5+
use commands::init;
6+
use manifest::Loader;
7+
use modrinth::Client;
78

9+
mod commands;
810
mod manifest;
911
mod modrinth;
1012
mod mrpack;
1113

12-
use manifest::{Loader, Manifest};
13-
use modrinth::{Client, VersionType};
14-
use toml_edit::{DocumentMut, InlineTable};
15-
1614
/// Podzol - A modpack package manager
1715
#[derive(Parser)]
1816
#[command(version, about, long_about = None)]
@@ -101,100 +99,13 @@ async fn main() -> Result<()> {
10199
projects,
102100
project_type,
103101
} => {
104-
let manifest_src = fs::read_to_string("podzol.toml")?;
105-
let mut document: DocumentMut = manifest_src.parse()?;
106-
let manifest: Manifest = toml_edit::de::from_document(document.clone())?;
107-
108-
for name in projects {
109-
let project = client.get_project(&name).await?;
110-
111-
let versions = client
112-
.get_project_versions(
113-
&name,
114-
&manifest.enviroment.minecraft,
115-
&manifest.enviroment.loaders,
116-
)
117-
.await?;
118-
119-
// FIXME: use a proper strategy to choose
120-
let version = &versions[0];
121-
let version_number = &version.version_number;
122-
123-
let mut mod_table = InlineTable::new();
124-
mod_table.insert("version", version_number.into());
125-
mod_table.insert("side", project.get_side().to_string().into());
126-
document[project_type.as_table()][&name] = mod_table.into();
127-
128-
println!(
129-
"Added {name} {version_number} to {}",
130-
project_type.as_table()
131-
);
132-
}
133-
134-
fs::write("podzol.toml", document.to_string())?;
102+
commands::add(&client, projects, project_type).await?;
135103
}
136104
Commands::Export => {
137-
let manifest: Manifest = toml_edit::de::from_slice(&fs::read("podzol.toml")?)?;
138-
139-
let mut writer = ZipFileWriter::with_tokio(
140-
File::create(format!(
141-
"{}-{}.mrpack",
142-
manifest.pack.name, manifest.pack.version
143-
))
144-
.await?,
145-
);
146-
147-
manifest.build_mrpack(&client, &mut writer).await?;
148-
149-
writer.close().await?;
105+
commands::export(&client).await?;
150106
}
151107
Commands::Init { version, name, .. } => {
152-
let current_dir = current_dir().expect("Failed to get current directory");
153-
154-
let name = if let Some(name) = name {
155-
name
156-
} else {
157-
// TODO: some degree of error handling I guess
158-
current_dir
159-
.file_name()
160-
.and_then(|name| name.to_str())
161-
.unwrap_or("pack")
162-
.to_string()
163-
};
164-
165-
let minecraft_version = if let Some(version) = version {
166-
version
167-
} else {
168-
let versions = client.get_game_versions().await?;
169-
170-
let latest_version = versions
171-
.into_iter()
172-
.filter(|version| matches!(version.version_type, VersionType::Release))
173-
.max_by_key(|version| version.date)
174-
.ok_or(anyhow!("No valid Minecraft versions found"))?;
175-
176-
latest_version.version
177-
};
178-
179-
let manifest = Manifest {
180-
pack: manifest::Pack {
181-
name,
182-
version: "0.1.0".to_string(),
183-
description: None,
184-
},
185-
enviroment: manifest::Enviroment {
186-
minecraft: minecraft_version,
187-
loaders: HashMap::new(),
188-
},
189-
files: HashMap::new(),
190-
mods: HashMap::new(),
191-
resource_packs: HashMap::new(),
192-
shaders: HashMap::new(),
193-
};
194-
195-
fs::write("podzol.toml", &toml_edit::ser::to_string_pretty(&manifest)?)?;
196-
197-
git2::Repository::init(current_dir)?;
108+
init(&client, version, name).await?;
198109
}
199110
Commands::Remove => todo!(),
200111
}

0 commit comments

Comments
 (0)