serde_gff/ver.rs
1//! Содержит реализацию структуры, описывающей версию GFF файла, реализацию типажей для
2//! конвертации других типов данных в версию и обратно и известные версии файлов
3
4use std::fmt::{self, Display, Formatter};
5use std::io::{Read, Write, Result};
6
7/// Версия формата файла. Записана во вторых 4-х байтах файла, сразу после сигнатуры
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct Version([u8; 4]);
10
11impl Version {
12 /// Версия GFF формата, являющаяся текущей. Заголовки, создаваемые без указания версии,
13 /// имеют данную версию в качестве умолчания.
14 //TODO: После решения https://github.com/rust-lang/rust/issues/24111 можно сделать функции
15 // константными и использовать метод `new`.
16 pub const V3_2: Version = Version(*b"V3.2");
17
18 /// Создает новый объект версии из старшей и младшей половины версии
19 #[inline]
20 pub fn new(major: u8, minor: u8) -> Self {
21 Version([b'V', major + b'0', b'.', minor + b'0'])
22 }
23 /// Старший номер версии формата файла, хранимый в байте 1 версии
24 #[inline]
25 pub fn major(&self) -> u8 { self.0[1] - b'0' }
26 /// Младший номер версии формата файла, хранимый в байте 3 версии
27 #[inline]
28 pub fn minor(&self) -> u8 { self.0[3] - b'0' }
29
30 /// Читает версию файла из потока
31 #[inline]
32 pub fn read<R: Read>(reader: &mut R) -> Result<Self> {
33 let mut version = Version([0u8; 4]);
34 reader.read(&mut version.0)?;
35 Ok(version)
36 }
37 /// Записывает версию файла в поток
38 #[inline]
39 pub fn write<W: Write>(&self, writer: &mut W) -> Result<()> {
40 writer.write_all(&self.0)
41 }
42}
43
44impl Display for Version {
45 /// Выводит версию в поток в формате `<major>.<minor>`
46 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
47 write!(f, "{}.{}", self.major(), self.minor())
48 }
49}