|
1 | 1 | use std::{backtrace::Backtrace, |
2 | 2 | collections::HashMap, |
3 | | - fs::read_to_string, |
4 | | - io::Write}; |
| 3 | + fs::{read_to_string, |
| 4 | + File}, |
| 5 | + io::{BufWriter, |
| 6 | + Write}}; |
5 | 7 |
|
6 | 8 | use log::{debug, |
7 | 9 | error, |
@@ -42,6 +44,69 @@ pub fn get_current_version(sourcemods_location: Option<String>) -> Option<usize> |
42 | 44 | } |
43 | 45 | } |
44 | 46 |
|
| 47 | +/// set the version in the `.adastral` file in the sourcemod folder. |
| 48 | +/// will silently fail when install_state is not InstallType::Adastral, or the |
| 49 | +/// sourcemod isn't installed. |
| 50 | +pub fn set_current_version( |
| 51 | + sourcemods_location: Option<String>, |
| 52 | + new_version: usize |
| 53 | +) -> Result<(), BeansError> |
| 54 | +{ |
| 55 | + let install_state = helper::install_state(sourcemods_location.clone()); |
| 56 | + if install_state != InstallType::Adastral |
| 57 | + { |
| 58 | + return Ok(()); |
| 59 | + } |
| 60 | + match get_mod_location(sourcemods_location) |
| 61 | + { |
| 62 | + Some(smp_x) => |
| 63 | + { |
| 64 | + // TODO generate BeansError instead of using panic |
| 65 | + let location = format!("{}.adastral", smp_x); |
| 66 | + let file = match helper::file_exists(location.clone()) |
| 67 | + { |
| 68 | + false => match File::create(&location) |
| 69 | + { |
| 70 | + Ok(v) => v, |
| 71 | + Err(e) => |
| 72 | + { |
| 73 | + return Err(BeansError::VersionFileWriteFailure { |
| 74 | + location: location.clone(), |
| 75 | + error: e |
| 76 | + }); |
| 77 | + } |
| 78 | + }, |
| 79 | + true => match File::open(&location) |
| 80 | + { |
| 81 | + Ok(v) => v, |
| 82 | + Err(e) => |
| 83 | + { |
| 84 | + return Err(BeansError::VersionFileOpenFailure { |
| 85 | + location: location.clone(), |
| 86 | + error: e |
| 87 | + }); |
| 88 | + } |
| 89 | + } |
| 90 | + }; |
| 91 | + let data = AdastralVersionFile { |
| 92 | + version: format!("{new_version}") |
| 93 | + }; |
| 94 | + debug!("[set_current_version] location: {location:}, content: {data:?}"); |
| 95 | + let mut writer = BufWriter::new(file); |
| 96 | + match serde_json::to_writer(&mut writer, &data) |
| 97 | + { |
| 98 | + Ok(_) => Ok(()), |
| 99 | + Err(e) => Err(BeansError::VersionFileSerializeFailure { |
| 100 | + location: location.clone(), |
| 101 | + instance: data.clone(), |
| 102 | + error: e |
| 103 | + }) |
| 104 | + } |
| 105 | + } |
| 106 | + None => Ok(()) // silently fail |
| 107 | + } |
| 108 | +} |
| 109 | + |
45 | 110 | fn get_version_location(sourcemods_location: Option<String>) -> Option<String> |
46 | 111 | { |
47 | 112 | get_mod_location(sourcemods_location).map(|v| format!("{}.adastral", v)) |
|
0 commit comments