databoard 0.3.1

Provides a hierarchical key-value-store
Documentation
// Copyright © 2025 Stephan Kunz
//! Implements the [`RemappingTarget`].

use core::{fmt::Display, str::FromStr};

use crate::{ConstString, Error, is_const_assignment, strip_board_pointer};

/// Target of a remapping entry
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum RemappingTarget {
	/// Target is a parent board entry.
	BoardPointer(ConstString),
	/// Target is a local board entry.
	LocalPointer(ConstString),
	/// Target is a root board entry.
	RootPointer(ConstString),
	/// Target is a value assignment via trait `FromStr`.
	StringAssignment(ConstString),
	// /// Target is a value assignment via trait `Any`.
	// ValueAssignment(Box<dyn Any + Send + Sync>),
	/// No remapping, to be used only used as return value.
	None(ConstString),
}

impl Display for RemappingTarget {
	fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
		match self {
			Self::BoardPointer(s) | Self::LocalPointer(s) | Self::RootPointer(s) => {
				write!(f, "{{{}}}", &s)
			}
			Self::StringAssignment(s) | Self::None(s) => {
				write!(f, "{}", &s)
			}
		}
	}
}

impl FromStr for RemappingTarget {
	type Err = Error;

	fn from_str(s: &str) -> Result<Self, Self::Err> {
		// is it a pointer into a databoard
		strip_board_pointer(s).map_or_else(
			|| {
				// is it a value assignment
				if is_const_assignment(s) {
					Ok(Self::StringAssignment(s.into()))
				} else {
					Err(Error::CreateRemapping { source: s.into() })
				}
			},
			|board_pointer| Ok(Self::BoardPointer(board_pointer.into())),
		)
	}
}

#[cfg(test)]
mod tests {
	use super::*;

	// check, that the auto traits are available
	const fn is_normal<T: Sized + Send + Sync>() {}

	#[test]
	const fn normal_types() {
		is_normal::<RemappingTarget>();
	}
}