1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
//! modul obsahující chybový typ
//! `cat-prepu`
//!
//! `cat-prep` používá na zpracování chyb knihovnu
//! `failure`, které umožňuje jednoduché formátování
//! a propagaci chyb.
//!
//! Bohužel,
//! místo správných chybových jsou v některých
//! variantách [`CatError`] typu uloženy stringy,
//! protože trait `Error` nemá podmínku [`Clone`
//! a některé chyby jsou tudíž neklonovatelné.

use failure::Fail;
use toml::de::Error as TomlError;

use crate::render::RenderType;

/// výčet obsahující možné chyby
#[derive(Debug, Fail, Clone)]
pub enum CatError {
	/// Složka `teachers` neexistuje
	#[fail(display = "teachers folder doesn't exist")]
	NoTeacherFolder,
	/// Soubor `teachers` není složka
	#[fail(display = "file 'teachers' is not a folder")]
	TeachersArentFolder,
	/// Karta učitele nemá správný formát
	#[fail(display = "invalid teacher file: {}: {}", name, err)]
	InvalidTeacherCard {
		/// název souboru s neplatnou kartou učitele
		name: String,
		/// chyba parsování
		err:  TomlError,
	},
	/// Souboru chybí header, nebo je nesprávně ukončený
	#[fail(display = "the header is either missing or invalid")]
	InvalidOrMissingHeader,
	/// Header souboru není možné naparsovat jako TOML,
	/// nebo neobsahuje všechny povinné hodnoty
	#[fail(display = "the header has invalid format: {}", err)]
	InvalidHeaderFormat {
		/// chyba parsování
		err: TomlError,
	},
	/// Nepodařilo se spustit příkaz v shell,
	/// nšbo došlo k chybě při běhu.
	///
	/// Může implikovat, že některý z následujících nástrojů není dostupný:
	/// - git
	/// - ls
	/// - xargs
	/// - true
	/// - sh
	#[fail(
		display = "failed to run command: {} exited with code {} and output '{}'",
		name, status, error
	)]
	CommandFailed {
		/// název programu (může obsahovat buď název samotného programu nebo celý příkaz)
		name:   String,
		/// status, se kterým příkaz skončil
		status: i32,
		/// chybový výstup příkazu
		error:  String,
	},
	/// `mdBook` neběží v repozitáři.
	/// Pro uživatelské funkce vyžaduje `cat-prep` gitový repozitář
	#[fail(
		display = "mdbook isn't running in a git repository or the repository is bare: {}",
		error
	)]
	NotARepo {
		/// Chybový výstup příkazu ke zjištění,
		/// zda se daná kniha nachází v repozitáři.
		///
		/// Výstup je zachován, protože také může indikovat,
		/// že `git` není nainstalovaný, repozitář je porušený
		/// nebo se nepodařilo přečíst soubory `gitu`
		error: String,
	},
	/// v šablonovém enginu `tinytemplate` došlo k chybě
	#[fail(display = "tiny template encountered an error: {}", error)]
	TinyError {
		/// chyba z šablonového enginu
		/// `tinytemplate`
		error: String,
	}, //  TinyError is not Clone :(
	/// některý render zůstal po zavolání funkce `render::execute_renders` nevyužitý
	#[fail(display = "orphan renders: {} at {}", render, site)]
	OrphanRender {
		/// soubor, který měl tento render modifikoat
		site:   String,
		/// samotný render
		render: RenderType,
	},
	/// jiná chyba (pro využití 3. stranou)
	#[fail(display = "other error: {}", msg)]
	OtherError {
		/// text jiné chyby
		msg: String,
	},
}