guitarpro/
formats.rs

1/// Supported file formats
2#[derive(Debug, Clone, PartialEq)]
3pub enum FileFormat {
4    /// Guitar Pro 3 format
5    GuitarPro3,
6    /// Guitar Pro 4 format
7    GuitarPro4,
8    /// Guitar Pro 5 format
9    GuitarPro5,
10    /// Guitar Pro X format (compressed)
11    GuitarProX,
12    /// Modern Guitar Pro format
13    GuitarPro,
14    /// MuseScore format
15    MuseScore,
16}
17
18impl FileFormat {
19    /// Get file extension for the format
20    pub fn extension(&self) -> &'static str {
21        match self {
22            FileFormat::GuitarPro3 => "gp3",
23            FileFormat::GuitarPro4 => "gp4",
24            FileFormat::GuitarPro5 => "gp5",
25            FileFormat::GuitarProX => "gpx",
26            FileFormat::GuitarPro => "gp",
27            FileFormat::MuseScore => "mscz",
28        }
29    }
30
31    /// Get human-readable name for the format
32    pub fn name(&self) -> &'static str {
33        match self {
34            FileFormat::GuitarPro3 => "Guitar Pro 3",
35            FileFormat::GuitarPro4 => "Guitar Pro 4",
36            FileFormat::GuitarPro5 => "Guitar Pro 5",
37            FileFormat::GuitarProX => "Guitar Pro X",
38            FileFormat::GuitarPro => "Guitar Pro",
39            FileFormat::MuseScore => "MuseScore",
40        }
41    }
42
43    /// Check if format supports compression
44    pub fn supports_compression(&self) -> bool {
45        matches!(self, FileFormat::GuitarProX | FileFormat::MuseScore)
46    }
47
48    /// Check if format is XML-based
49    pub fn is_xml_based(&self) -> bool {
50        matches!(self, FileFormat::MuseScore)
51    }
52
53    /// Get supported versions for the format
54    pub fn supported_versions(&self) -> Vec<&'static str> {
55        match self {
56            FileFormat::GuitarPro3 => vec!["3.00"],
57            FileFormat::GuitarPro4 => vec!["4.00", "4.06"],
58            FileFormat::GuitarPro5 => vec!["5.00", "5.10"],
59            FileFormat::GuitarProX => vec!["6.00", "6.08"],
60            FileFormat::GuitarPro => vec!["7.00", "7.50", "8.00"],
61            FileFormat::MuseScore => vec!["2.0", "3.0", "4.0"],
62        }
63    }
64}