/*
Copyright 2023-2024 Gabriel Bjørnager Jensen.
This file is part of eAS.
eAS is free software: you can redistribute it
and/or modify it under the terms of the GNU
General Public License as published by the Free
Software Foundation, either version 3 of the
License, or (at your option) any later version.
eAS is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU
General Public License along with eAS. If not,
see .
*/
use crate::source_location::SourceLocation;
// e0??? | Syntax errors
// e1??? | CLI errors
// e2??? | Internal errors
#[derive(Clone)]
pub enum Error {
EndOfFile( String),
UnknownMnemonic( String, SourceLocation),
AccessDenied( String),
IllegalCharacter( char, SourceLocation),
IncompleteNode( SourceLocation),
InvalidShortParameter( char),
MissingInputFile,
MissingTargetProcessor,
UnterminatedString( SourceLocation),
MissingShortValue( char),
InvalidTargetFormat( String),
InvalidTargetProcessor(String),
InvalidLongParameter( String),
MissingLongValue( String),
MissingShortArgument,
InvalidFileEncoding( String),
MissingLongArgument,
}
impl Error {
#[must_use]
pub const fn code(&self) -> u16 {
use Error::*;
return match *self {
EndOfFile( ..) => 0x0000,
UnknownMnemonic( ..) => 0x0001,
IllegalCharacter( ..) => 0x0002,
IncompleteNode( ..) => 0x0003,
UnterminatedString( ..) => 0x0004,
InvalidShortParameter( ..) => 0x1000,
MissingInputFile => 0x1001,
MissingTargetProcessor => 0x1002,
MissingShortValue( ..) => 0x1003,
InvalidTargetFormat( ..) => 0x1004,
InvalidTargetProcessor(..) => 0x1005,
InvalidLongParameter( ..) => 0x1006,
MissingLongValue( ..) => 0x1007,
MissingShortArgument => 0x1008,
InvalidFileEncoding( ..) => 0x1009,
MissingLongArgument => 0x100A,
AccessDenied( ..) => 0x2000,
};
}
#[must_use]
pub fn message(&self) -> String {
use Error::*;
return match *self {
AccessDenied( ref f) => format!("access denied to \"{f}\""),
EndOfFile( _) => String::from("end of file"),
IllegalCharacter( c, _) => format!("illegal character U+{:04X} '{c}'", c as u32),
IncompleteNode( _) => format!("incomplete node"),
InvalidFileEncoding( ref s) => format!("invalid file encoding \"{s}\""),
InvalidLongParameter( ref s) => format!("invalid target processor `--{s}`"),
InvalidShortParameter( c) => format!("invalid short parameter `-{c}`"),
InvalidTargetFormat( ref s) => format!("invalid target format \"{s}\""),
InvalidTargetProcessor(ref s) => format!("invalid target processor \"{s}\""),
MissingInputFile => String::from("missing input file"),
MissingLongArgument => String::from("missing long argument after `--"),
MissingLongValue( ref s) => format!("missing value for long parameter `--{s}`"),
MissingShortArgument => format!("missing short parameter after `-`"),
MissingShortValue( c) => format!("missing value for short parameter `-{c}`"),
MissingTargetProcessor => String::from("missing target processor"),
UnknownMnemonic( ref s, _) => format!("invalid mnemonic {s}"),
UnterminatedString( _) => format!("unterminated string"),
};
}
#[must_use]
pub fn note(&self) -> Option {
use Error::*;
return match *self {
EndOfFile( ref f) => Some(format!("consider adding an END directive to \"{f}\"")),
IllegalCharacter( _, ref l) => Some(format!("{l}")),
IncompleteNode( ref l) => Some(format!("{l}")),
UnknownMnemonic( _, ref l) => Some(format!("{l}")),
UnterminatedString(ref l) => Some(format!("found string delimiter {l}")),
| InvalidTargetFormat( _)
| InvalidTargetProcessor(_)
| MissingLongArgument
| MissingShortArgument
=> Some(String::from("see `eas -h` or refer to the manual for more information")),
_ => None,
};
}
}