z_mirror/fmm
git clone https://git.raiguard.me/z_mirror/fmm
7007399
dependencies
1use semver:: Version ; 2use std:: fmt; 3use std:: str:: FromStr ; 4use thiserror:: Error ; 5 6use crate :: mods_set:: ModEnabledType ; 7 8# [ derive ( Clone , Debug )] 9pub struct InputMod { 10pub name : String , 11pub version : ModEnabledType , 12} 13 14impl FromStr for InputMod { 15type Err =InputModErr ; 16 17fn from_str ( s : & str ) ->Result < Self , Self :: Err > { 18let parts: Vec < & str > = s. split ( '@' ). collect (); 19match parts[ ..] { 20[ name] =>Ok ( Self { 21name : name. to_string (), 22version : ModEnabledType :: Latest , 23}), 24[ name, version] =>{ 25let parsed_version =Version :: parse ( version); 26if let Ok ( version) = parsed_version{ 27// Validate that the version does *not* have prerelease or build data 28if version. pre . len () >0 || version. build . len () >0 { 29Err ( InputModErr :: InvalidVersion ( version. to_string ())) 30} else { 31Ok ( Self { 32name : name. to_string (), 33version : ModEnabledType :: Version ( version), 34}) 35} 36} else { 37Err ( InputModErr :: InvalidVersion ( version. to_string ())) 38} 39} 40 _ =>Err ( InputModErr :: IncorrectArgCount ( parts. len ())), 41} 42} 43} 44 45impl fmt:: Display for InputMod { 46fn fmt ( & self , f : & mut fmt:: Formatter < ' _ >) -> fmt:: Result { 47write! ( 48 f, 49"{}{}" , 50self . name , 51match & self . version { 52ModEnabledType :: Version ( version) =>format! ( " v{}" , version), 53 _ =>"" . to_string (), 54} 55) 56} 57} 58 59# [ derive ( Debug , Error )] 60pub enum InputModErr { 61# [ error ( "Incorrect argument count: expected 1 or 2, got {0}" )] 62IncorrectArgCount ( usize ), 63# [ error ( "Invalid version identifier: `{0}`" )] 64InvalidVersion ( String ), 65}