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}