use crate::engine::*;
use melodium_core::common::executive::Level as LogLevel;
use melodium_core::DataTrait;
use melodium_macro::{mel_data, mel_function, mel_treatment};
struct RuntimeDisplay<'a>(&'a Value);
impl std::fmt::Display for RuntimeDisplay<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
DataTrait::display(self.0, f)
}
}
#[mel_treatment(
model engine Engine
input messages Stream<string>
)]
pub async fn log_stream(level: Level, label: string) {
let engine = EngineModel::into(engine);
while let Ok(msgs) = messages.recv_many_as::<string>().await {
for msg in msgs {
engine
.world()
.log(level.level, label.clone(), msg, Some(track_id))
.await;
}
}
}
#[mel_treatment(
model engine Engine
input label Block<string>
input messages Stream<string>
)]
pub async fn log_stream_label(level: Level) {
let engine = EngineModel::into(engine);
if let Ok(label) = label.recv_one_as::<String>().await {
while let Ok(msgs) = messages.recv_many_as::<string>().await {
for msg in msgs {
engine
.world()
.log(level.level, label.clone(), msg, Some(track_id))
.await;
}
}
}
}
#[mel_treatment(
model engine Engine
input message Block<string>
)]
pub async fn log_block(level: Level, label: string) {
let engine = EngineModel::into(engine);
if let Ok(msg) = message.recv_one_as::<string>().await {
engine
.world()
.log(level.level, label, msg, Some(track_id))
.await;
}
}
#[mel_treatment(
model engine Engine
input label Block<string>
input message Block<string>
)]
pub async fn log_block_label(level: Level) {
let engine = EngineModel::into(engine);
if let Ok(label) = label.recv_one_as::<String>().await {
if let Ok(msg) = message.recv_one_as::<string>().await {
engine
.world()
.log(level.level, label, msg, Some(track_id))
.await;
}
}
}
#[mel_treatment(
model engine Engine
input display Stream<D>
generic D (Display)
)]
pub async fn log_data_stream(level: Level, label: string) {
let engine = EngineModel::into(engine);
while let Ok(values) = display
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
for val in values {
engine
.world()
.log(
level.level,
label.clone(),
format!("{}", RuntimeDisplay(&val)),
Some(track_id),
)
.await;
}
}
}
#[mel_treatment(
model engine Engine
input label Block<string>
input display Stream<D>
generic D (Display)
)]
pub async fn log_data_stream_label(level: Level) {
let engine = EngineModel::into(engine);
if let Ok(label) = label.recv_one_as::<String>().await {
while let Ok(values) = display
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
for val in values {
engine
.world()
.log(
level.level,
label.clone(),
format!("{}", RuntimeDisplay(&val)),
Some(track_id),
)
.await;
}
}
}
}
#[mel_treatment(
model engine Engine
input display Block<D>
generic D (Display)
)]
pub async fn log_data_block(level: Level, label: string) {
let engine = EngineModel::into(engine);
if let Ok(val) = display.recv_one().await {
engine
.world()
.log(
level.level,
label,
format!("{}", RuntimeDisplay(&val)),
Some(track_id),
)
.await;
}
}
#[mel_treatment(
model engine Engine
input label Block<string>
input display Block<D>
generic D (Display)
)]
pub async fn log_data_block_label(level: Level) {
let engine = EngineModel::into(engine);
if let Ok(label) = label.recv_one_as::<String>().await {
if let Ok(val) = display.recv_one().await {
engine
.world()
.log(
level.level,
label,
format!("{}", RuntimeDisplay(&val)),
Some(track_id),
)
.await;
}
}
}
#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
#[mel_data(traits(Serialize Deserialize Bounded PartialEquality Equality PartialOrder Order))]
pub struct Level {
pub level: LogLevel,
}
fn level_bounded_min() -> Level {
Level {
level: LogLevel::Trace,
}
}
fn level_bounded_max() -> Level {
Level {
level: LogLevel::Error,
}
}
#[mel_function]
pub fn error() -> Level {
Level {
level: LogLevel::Error,
}
}
#[mel_function]
pub fn warning() -> Level {
Level {
level: LogLevel::Warning,
}
}
#[mel_function]
pub fn info() -> Level {
Level {
level: LogLevel::Info,
}
}
#[mel_function]
pub fn debug() -> Level {
Level {
level: LogLevel::Debug,
}
}
#[mel_function]
pub fn trace() -> Level {
Level {
level: LogLevel::Trace,
}
}