trion 0.7.2

Trion is an assembler designed to be used with the Raspberry Pico (RP2040) microcontroller.
Documentation
use core::fmt;
use std::error::Error;
use std::sync::Arc;

mod operator;
pub mod parse;
pub mod token;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Positioned<T: ?Sized>
{
	pub line: u32,
	pub col: u32,
	pub value: T,
}

impl<T> Positioned<T>
{
	pub fn with_name(self, name: Arc<String>) -> PosNamed<T>
	{
		PosNamed
		{
			name,
			line: self.line,
			col: self.col,
			value: self.value,
		}
	}
	
	pub fn convert<R>(&self, value: R) -> Positioned<R>
	{
		Positioned{line: self.line, col: self.col, value}
	}
	
	pub fn convert_fn<R>(self, func: impl FnOnce(T) -> R) -> Positioned<R>
	{
		let Positioned{line, col, value} = self;
		Positioned{line, col, value: func(value)}
	}
}

impl<T> From<PosNamed<T>> for Positioned<T>
{
	fn from(value: PosNamed<T>) -> Self
	{
		Positioned
		{
			line: value.line,
			col: value.col,
			value: value.value,
		}
	}
}

impl<T: fmt::Display + ?Sized> fmt::Display for Positioned<T>
{
	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
	{
		write!(f, "{} ({}:{})", &self.value, self.line, self.col)
	}
}

impl<T: Error + ?Sized> Error for Positioned<T>
{
	fn source(&self) -> Option<&(dyn Error + 'static)>
	{
		self.value.source()
	}
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PosNamed<T: ?Sized>
{
	pub name: Arc<String>,
	pub line: u32,
	pub col: u32,
	pub value: T,
}

impl<T> PosNamed<T>
{
	pub fn convert<R>(self, value: R) -> PosNamed<R>
	{
		PosNamed{name: self.name, line: self.line, col: self.col, value}
	}
	
	pub fn convert_fn<R>(self, func: impl FnOnce(T) -> R) -> PosNamed<R>
	{
		let PosNamed{name, line, col, value} = self;
		PosNamed{name, line, col, value: func(value)}
	}
}

impl<T: fmt::Display + ?Sized> fmt::Display for PosNamed<T>
{
	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
	{
		write!(f, "{} ({}:{}:{})", &self.value, self.name, self.line, self.col)
	}
}

impl<T: Error + ?Sized> Error for PosNamed<T>
{
	fn source(&self) -> Option<&(dyn Error + 'static)>
	{
		self.value.source()
	}
}