Skip to content

Commit b91b7dc

Browse files
committed
Added function to attach key to litterbox
1 parent aeae513 commit b91b7dc

4 files changed

Lines changed: 73 additions & 14 deletions

File tree

litterbox/src/errors.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ pub enum LitterboxError {
2222
DockerfileAlreadyExists(PathBuf),
2323
PromptError(InquireError),
2424
FailedToSerialise(&'static str),
25+
KeyAlreadyExists(String),
26+
KeyDoesNotExist(String),
27+
AlreadyAttachedToKey(String, String),
2528
}
2629

2730
impl LitterboxError {
@@ -91,7 +94,18 @@ impl LitterboxError {
9194
println!("Failed to retrieve valid input from user.");
9295
}
9396
LitterboxError::FailedToSerialise(name) => {
94-
println!("Failed to serialise {name}");
97+
println!("Failed to serialise {name}.");
98+
}
99+
LitterboxError::KeyAlreadyExists(name) => {
100+
println!("Key named {name} already exists.")
101+
}
102+
LitterboxError::KeyDoesNotExist(name) => {
103+
println!("Key named {name} does not exist.")
104+
}
105+
LitterboxError::AlreadyAttachedToKey(key_name, litterbox_name) => {
106+
println!(
107+
"Litterbox named {litterbox_name} already attached to key named {key_name}."
108+
)
95109
}
96110
}
97111
}

litterbox/src/keys.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,14 @@ impl Keys {
150150
}
151151
}
152152

153+
fn key_mut(&mut self, key_name: &str) -> Option<&mut Key> {
154+
self.keys.iter_mut().find(|key| key.name == key_name)
155+
}
156+
153157
pub fn generate(&mut self, key_name: &str) -> Result<(), LitterboxError> {
154-
// FIXME: make sure a key with this name does not exist yet
158+
if self.key_mut(key_name).is_some() {
159+
return Err(LitterboxError::KeyAlreadyExists(key_name.to_owned()));
160+
}
155161

156162
let password = self.prompt_password()?;
157163
self.keys.push(Key::new(key_name, &password));
@@ -170,15 +176,39 @@ impl Keys {
170176
}
171177
});
172178

173-
if found {
174-
self.save_to_file()?;
175-
println!("Deleted key named {key_name}");
176-
} else {
177-
println!("Could not find key named {key_name}. Nothing deleted.")
179+
if !found {
180+
return Err(LitterboxError::KeyDoesNotExist(key_name.to_owned()));
178181
}
179182

183+
self.save_to_file()?;
184+
println!("Deleted key named {key_name}");
180185
Ok(())
181186
}
187+
188+
pub fn attach(&mut self, key_name: &str, litterbox_name: &str) -> Result<(), LitterboxError> {
189+
match self.key_mut(key_name) {
190+
Some(key) => {
191+
if key
192+
.attached_litterboxes
193+
.iter()
194+
.find(|name| **name == litterbox_name)
195+
.is_some()
196+
{
197+
return Err(LitterboxError::AlreadyAttachedToKey(
198+
key_name.to_owned(),
199+
litterbox_name.to_owned(),
200+
));
201+
}
202+
203+
key.attached_litterboxes.push(litterbox_name.to_owned());
204+
self.save_to_file()?;
205+
206+
println!("Attached {litterbox_name} to {key_name}!");
207+
Ok(())
208+
}
209+
None => Err(LitterboxError::KeyDoesNotExist(key_name.to_owned())),
210+
}
211+
}
182212
}
183213

184214
#[cfg(test)]

litterbox/src/main.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,18 @@ enum KeyCommands {
169169
/// The name of the key
170170
name: String,
171171
},
172+
173+
/// Attach an existing key to a Litterbox
174+
Attach {
175+
/// The name of the key
176+
key_name: String,
177+
178+
/// The name of the Litterbox
179+
litterbox_name: String,
180+
},
172181
}
173182

174-
fn try_run() -> Result<(), LitterboxError> {
183+
fn run_menu() -> Result<(), LitterboxError> {
175184
let args = Args::parse();
176185
match args.command {
177186
Commands::Prepare { name } => {
@@ -185,7 +194,7 @@ fn try_run() -> Result<(), LitterboxError> {
185194
println!("Litterbox created!");
186195
}
187196
Commands::Enter { name } => {
188-
enter_distrobox(&name)?;
197+
enter_litterbox(&name)?;
189198
println!("Exited Litterbox...")
190199
}
191200
Commands::List => {
@@ -196,7 +205,7 @@ fn try_run() -> Result<(), LitterboxError> {
196205
println!("{table}");
197206
}
198207
Commands::Delete { name } => {
199-
delete_distrobox(&name)?;
208+
delete_litterbox(&name)?;
200209
}
201210
Commands::Keys(cmd) => process_key_cmd(cmd)?,
202211
}
@@ -215,14 +224,20 @@ fn process_key_cmd(cmd: KeyCommands) -> Result<(), LitterboxError> {
215224
KeyCommands::Delete { name } => {
216225
keys.delete(&name)?;
217226
}
227+
KeyCommands::Attach {
228+
key_name,
229+
litterbox_name,
230+
} => {
231+
keys.attach(&key_name, &litterbox_name)?;
232+
}
218233
}
219234
Ok(())
220235
}
221236

222237
fn main() {
223238
env_logger::init();
224239

225-
if let Err(e) = try_run() {
240+
if let Err(e) = run_menu() {
226241
e.print();
227242
}
228243
}

litterbox/src/podman.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ pub fn create_litterbox(lbx_name: &str, user: &str) -> Result<(), LitterboxError
208208
Ok(())
209209
}
210210

211-
pub fn enter_distrobox(name: &str) -> Result<(), LitterboxError> {
211+
pub fn enter_litterbox(name: &str) -> Result<(), LitterboxError> {
212212
let mut child = Command::new("podman")
213213
.args([
214214
"start",
@@ -220,11 +220,11 @@ pub fn enter_distrobox(name: &str) -> Result<(), LitterboxError> {
220220
.map_err(LitterboxError::RunPodman)?;
221221

222222
child.wait().map_err(LitterboxError::RunPodman)?;
223-
debug!("Distrobox finished.");
223+
debug!("Litterbox finished.");
224224
Ok(())
225225
}
226226

227-
pub fn delete_distrobox(lbx_name: &str) -> Result<(), LitterboxError> {
227+
pub fn delete_litterbox(lbx_name: &str) -> Result<(), LitterboxError> {
228228
// We check if it exists before promting the user
229229
let container_id = get_container_id(lbx_name)?;
230230

0 commit comments

Comments
 (0)