2024-02-26 07:00:51 +01:00
|
|
|
pub use iced_core as core;
|
2025-04-17 03:24:17 +02:00
|
|
|
pub use iced_futures as futures;
|
2024-02-27 15:19:26 +01:00
|
|
|
|
2024-05-09 12:32:25 +02:00
|
|
|
use crate::core::theme;
|
2024-02-28 15:25:45 +01:00
|
|
|
use crate::core::window;
|
2025-04-17 03:24:17 +02:00
|
|
|
use crate::futures::Subscription;
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub use internal::Span;
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
|
pub struct Metadata {
|
|
|
|
|
pub name: &'static str,
|
|
|
|
|
pub theme: Option<theme::Palette>,
|
|
|
|
|
pub can_time_travel: bool,
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-09 21:50:21 +02:00
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
|
pub enum Primitive {
|
|
|
|
|
Quad,
|
|
|
|
|
Triangle,
|
|
|
|
|
Shader,
|
|
|
|
|
Image,
|
|
|
|
|
Text,
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
|
pub enum Command {
|
|
|
|
|
RewindTo { message: usize },
|
2025-04-20 21:50:12 +02:00
|
|
|
GoLive,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn enable() {
|
|
|
|
|
internal::enable();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn disable() {
|
|
|
|
|
internal::disable();
|
2025-04-17 03:24:17 +02:00
|
|
|
}
|
|
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
pub fn init(metadata: Metadata) {
|
|
|
|
|
internal::init(metadata);
|
2024-05-10 20:08:09 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-28 09:48:55 +02:00
|
|
|
pub fn quit() -> bool {
|
|
|
|
|
internal::quit()
|
2024-05-11 12:25:44 +02:00
|
|
|
}
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn theme_changed(f: impl FnOnce() -> Option<theme::Palette>) {
|
|
|
|
|
internal::theme_changed(f);
|
2024-02-27 15:19:26 +01:00
|
|
|
}
|
|
|
|
|
|
2025-03-13 02:07:06 +01:00
|
|
|
pub fn tasks_spawned(amount: usize) {
|
2025-04-29 23:01:45 +02:00
|
|
|
internal::tasks_spawned(amount);
|
2024-05-13 13:21:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn subscriptions_tracked(amount: usize) {
|
2025-04-29 23:01:45 +02:00
|
|
|
internal::subscriptions_tracked(amount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn layers_rendered(amount: impl FnOnce() -> usize) {
|
|
|
|
|
internal::layers_rendered(amount);
|
2024-05-13 13:21:10 +02:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn boot() -> Span {
|
|
|
|
|
internal::boot()
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-13 13:21:10 +02:00
|
|
|
pub fn update(message: &impl std::fmt::Debug) -> Span {
|
|
|
|
|
internal::update(message)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn view(window: window::Id) -> Span {
|
|
|
|
|
internal::view(window)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn layout(window: window::Id) -> Span {
|
|
|
|
|
internal::layout(window)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn interact(window: window::Id) -> Span {
|
|
|
|
|
internal::interact(window)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn draw(window: window::Id) -> Span {
|
|
|
|
|
internal::draw(window)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-09 21:50:21 +02:00
|
|
|
pub fn prepare(primitive: Primitive) -> Span {
|
|
|
|
|
internal::prepare(primitive)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn render(primitive: Primitive) -> Span {
|
|
|
|
|
internal::render(primitive)
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn present(window: window::Id) -> Span {
|
|
|
|
|
internal::present(window)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-16 18:17:14 +02:00
|
|
|
pub fn time(name: impl Into<String>) -> Span {
|
|
|
|
|
internal::time(name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn time_with<T>(name: impl Into<String>, f: impl FnOnce() -> T) -> T {
|
|
|
|
|
let span = time(name);
|
|
|
|
|
let result = f();
|
|
|
|
|
span.finish();
|
|
|
|
|
|
|
|
|
|
result
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
pub fn commands() -> Subscription<Command> {
|
|
|
|
|
internal::commands()
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-12 16:51:45 +01:00
|
|
|
#[cfg(all(feature = "enable", not(target_arch = "wasm32")))]
|
2024-02-26 07:00:51 +01:00
|
|
|
mod internal {
|
2024-05-09 12:32:25 +02:00
|
|
|
use crate::core::theme;
|
2024-05-10 20:08:09 +02:00
|
|
|
use crate::core::time::Instant;
|
2024-02-28 15:25:45 +01:00
|
|
|
use crate::core::window;
|
2025-04-17 03:24:17 +02:00
|
|
|
use crate::futures::Subscription;
|
|
|
|
|
use crate::futures::futures::Stream;
|
2025-05-01 04:19:44 +02:00
|
|
|
use crate::{Command, Metadata, Primitive};
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
use iced_beacon as beacon;
|
|
|
|
|
|
|
|
|
|
use beacon::client::{self, Client};
|
|
|
|
|
use beacon::span;
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
use std::sync::atomic::{self, AtomicBool, AtomicUsize};
|
2025-03-04 19:11:37 +01:00
|
|
|
use std::sync::{LazyLock, RwLock};
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
pub fn init(metadata: Metadata) {
|
|
|
|
|
let name = metadata.name.split("::").next().unwrap_or(metadata.name);
|
2024-05-16 13:47:02 +02:00
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
*METADATA.write().expect("Write application metadata") =
|
|
|
|
|
client::Metadata {
|
|
|
|
|
name,
|
|
|
|
|
theme: metadata.theme,
|
|
|
|
|
can_time_travel: metadata.can_time_travel,
|
|
|
|
|
};
|
2024-05-10 20:08:09 +02:00
|
|
|
}
|
2024-02-27 15:38:47 +01:00
|
|
|
|
2025-04-28 09:48:55 +02:00
|
|
|
pub fn quit() -> bool {
|
2024-05-11 12:25:44 +02:00
|
|
|
if BEACON.is_connected() {
|
|
|
|
|
BEACON.quit();
|
2025-04-06 17:21:20 +02:00
|
|
|
|
2025-04-28 09:48:55 +02:00
|
|
|
true
|
2024-05-11 12:25:44 +02:00
|
|
|
} else {
|
2025-04-28 09:48:55 +02:00
|
|
|
false
|
2024-05-11 12:25:44 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn theme_changed(f: impl FnOnce() -> Option<theme::Palette>) {
|
|
|
|
|
let Some(palette) = f() else {
|
|
|
|
|
return;
|
|
|
|
|
};
|
2024-02-27 15:38:47 +01:00
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
if METADATA.read().expect("Read last palette").theme.as_ref()
|
2024-05-10 20:08:09 +02:00
|
|
|
!= Some(&palette)
|
|
|
|
|
{
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::ThemeChanged(palette));
|
2024-05-10 20:08:09 +02:00
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
METADATA.write().expect("Write last palette").theme = Some(palette);
|
2024-02-27 15:38:47 +01:00
|
|
|
}
|
2024-02-27 15:19:26 +01:00
|
|
|
}
|
|
|
|
|
|
2025-03-13 02:07:06 +01:00
|
|
|
pub fn tasks_spawned(amount: usize) {
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::CommandsSpawned(amount));
|
2024-05-13 13:21:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn subscriptions_tracked(amount: usize) {
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::SubscriptionsTracked(amount));
|
2024-05-13 13:21:10 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-29 23:01:45 +02:00
|
|
|
pub fn layers_rendered(amount: impl FnOnce() -> usize) {
|
|
|
|
|
log(client::Event::LayersRendered(amount()));
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn boot() -> Span {
|
|
|
|
|
span(span::Stage::Boot)
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-13 13:21:10 +02:00
|
|
|
pub fn update(message: &impl std::fmt::Debug) -> Span {
|
|
|
|
|
let span = span(span::Stage::Update);
|
2025-04-07 20:02:39 +02:00
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
let number = LAST_UPDATE.fetch_add(1, atomic::Ordering::Relaxed);
|
|
|
|
|
|
2025-04-07 20:02:39 +02:00
|
|
|
let start = Instant::now();
|
2024-05-16 13:47:34 +02:00
|
|
|
let message = format!("{message:?}");
|
2025-04-07 20:02:39 +02:00
|
|
|
let elapsed = start.elapsed();
|
|
|
|
|
|
|
|
|
|
if elapsed.as_millis() >= 1 {
|
|
|
|
|
log::warn!(
|
|
|
|
|
"Slow `Debug` implementation of `Message` (took {elapsed:?})!"
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-05-13 13:21:10 +02:00
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
let message = if message.len() > 49 {
|
2025-05-02 19:53:44 +02:00
|
|
|
message
|
|
|
|
|
.chars()
|
|
|
|
|
.take(49)
|
|
|
|
|
.chain("...".chars())
|
|
|
|
|
.collect::<String>()
|
2024-05-13 13:21:10 +02:00
|
|
|
} else {
|
|
|
|
|
message
|
2025-04-17 03:24:17 +02:00
|
|
|
};
|
|
|
|
|
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::MessageLogged { number, message });
|
2024-05-13 13:21:10 +02:00
|
|
|
|
|
|
|
|
span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn view(window: window::Id) -> Span {
|
|
|
|
|
span(span::Stage::View(window))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn layout(window: window::Id) -> Span {
|
|
|
|
|
span(span::Stage::Layout(window))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn interact(window: window::Id) -> Span {
|
|
|
|
|
span(span::Stage::Interact(window))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn draw(window: window::Id) -> Span {
|
|
|
|
|
span(span::Stage::Draw(window))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-09 21:50:21 +02:00
|
|
|
pub fn prepare(primitive: Primitive) -> Span {
|
|
|
|
|
span(span::Stage::Prepare(to_primitive(primitive)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn render(primitive: Primitive) -> Span {
|
|
|
|
|
span(span::Stage::Render(to_primitive(primitive)))
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn present(window: window::Id) -> Span {
|
|
|
|
|
span(span::Stage::Present(window))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-16 18:17:14 +02:00
|
|
|
pub fn time(name: impl Into<String>) -> Span {
|
|
|
|
|
span(span::Stage::Custom(name.into()))
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-20 21:50:12 +02:00
|
|
|
pub fn enable() {
|
|
|
|
|
ENABLED.store(true, atomic::Ordering::Relaxed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn disable() {
|
|
|
|
|
ENABLED.store(false, atomic::Ordering::Relaxed);
|
2024-03-01 22:04:46 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
pub fn commands() -> Subscription<Command> {
|
|
|
|
|
fn listen_for_commands() -> impl Stream<Item = Command> {
|
|
|
|
|
use crate::futures::futures::stream;
|
|
|
|
|
|
|
|
|
|
stream::unfold(BEACON.subscribe(), async move |mut receiver| {
|
|
|
|
|
let command = match receiver.recv().await? {
|
|
|
|
|
client::Command::RewindTo { message } => {
|
|
|
|
|
Command::RewindTo { message }
|
|
|
|
|
}
|
2025-04-20 21:50:12 +02:00
|
|
|
client::Command::GoLive => Command::GoLive,
|
2025-04-17 03:24:17 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Some((command, receiver))
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Subscription::run(listen_for_commands)
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
fn span(span: span::Stage) -> Span {
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::SpanStarted(span.clone()));
|
2024-05-10 20:08:09 +02:00
|
|
|
|
|
|
|
|
Span {
|
|
|
|
|
span,
|
2024-02-26 07:00:51 +01:00
|
|
|
start: Instant::now(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-09 21:50:21 +02:00
|
|
|
fn to_primitive(primitive: Primitive) -> span::Primitive {
|
|
|
|
|
match primitive {
|
|
|
|
|
Primitive::Quad => span::Primitive::Quad,
|
|
|
|
|
Primitive::Triangle => span::Primitive::Triangle,
|
|
|
|
|
Primitive::Shader => span::Primitive::Shader,
|
|
|
|
|
Primitive::Text => span::Primitive::Text,
|
|
|
|
|
Primitive::Image => span::Primitive::Image,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-20 21:50:12 +02:00
|
|
|
fn log(event: client::Event) {
|
|
|
|
|
if ENABLED.load(atomic::Ordering::Relaxed) {
|
|
|
|
|
BEACON.log(event);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-26 07:00:51 +01:00
|
|
|
#[derive(Debug)]
|
2024-05-10 20:08:09 +02:00
|
|
|
pub struct Span {
|
|
|
|
|
span: span::Stage,
|
2024-02-26 07:00:51 +01:00
|
|
|
start: Instant,
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
impl Span {
|
2024-02-26 07:00:51 +01:00
|
|
|
pub fn finish(self) {
|
2025-04-20 21:50:12 +02:00
|
|
|
log(client::Event::SpanFinished(self.span, self.start.elapsed()));
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-04 19:11:37 +01:00
|
|
|
static BEACON: LazyLock<Client> = LazyLock::new(|| {
|
2025-05-01 04:19:44 +02:00
|
|
|
let metadata = METADATA.read().expect("Read application metadata");
|
|
|
|
|
|
|
|
|
|
client::connect(metadata.clone())
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
static METADATA: RwLock<client::Metadata> = RwLock::new(client::Metadata {
|
|
|
|
|
name: "",
|
|
|
|
|
theme: None,
|
|
|
|
|
can_time_travel: false,
|
2024-05-10 20:08:09 +02:00
|
|
|
});
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
static LAST_UPDATE: AtomicUsize = AtomicUsize::new(0);
|
2025-04-20 21:50:12 +02:00
|
|
|
static ENABLED: AtomicBool = AtomicBool::new(true);
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-03-12 16:51:45 +01:00
|
|
|
#[cfg(any(not(feature = "enable"), target_arch = "wasm32"))]
|
2024-02-26 07:00:51 +01:00
|
|
|
mod internal {
|
2024-05-10 20:08:09 +02:00
|
|
|
use crate::core::theme;
|
2024-02-28 15:25:45 +01:00
|
|
|
use crate::core::window;
|
2025-04-17 03:24:17 +02:00
|
|
|
use crate::futures::Subscription;
|
2025-05-01 04:19:44 +02:00
|
|
|
use crate::{Command, Metadata, Primitive};
|
2024-02-27 15:19:26 +01:00
|
|
|
|
2025-04-20 21:50:12 +02:00
|
|
|
pub fn enable() {}
|
|
|
|
|
pub fn disable() {}
|
|
|
|
|
|
2025-05-01 04:19:44 +02:00
|
|
|
pub fn init(_metadata: Metadata) {}
|
2024-05-10 20:08:09 +02:00
|
|
|
|
2025-04-28 09:48:55 +02:00
|
|
|
pub fn quit() -> bool {
|
|
|
|
|
false
|
2025-04-06 17:21:20 +02:00
|
|
|
}
|
2024-05-11 12:25:44 +02:00
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn theme_changed(_f: impl FnOnce() -> Option<theme::Palette>) {}
|
2024-02-27 15:19:26 +01:00
|
|
|
|
2025-03-13 02:07:06 +01:00
|
|
|
pub fn tasks_spawned(_amount: usize) {}
|
2024-05-13 13:21:10 +02:00
|
|
|
|
|
|
|
|
pub fn subscriptions_tracked(_amount: usize) {}
|
|
|
|
|
|
2025-04-29 23:01:45 +02:00
|
|
|
pub fn layers_rendered(_amount: impl FnOnce() -> usize) {}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn boot() -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-13 13:21:10 +02:00
|
|
|
pub fn update(_message: &impl std::fmt::Debug) -> Span {
|
2024-05-10 20:08:09 +02:00
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn view(_window: window::Id) -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn layout(_window: window::Id) -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn interact(_window: window::Id) -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn draw(_window: window::Id) -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-09 21:50:21 +02:00
|
|
|
pub fn prepare(_primitive: Primitive) -> Span {
|
|
|
|
|
Span
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn render(_primitive: Primitive) -> Span {
|
|
|
|
|
Span
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
pub fn present(_window: window::Id) -> Span {
|
|
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-16 18:17:14 +02:00
|
|
|
pub fn time(_name: impl Into<String>) -> Span {
|
2024-05-10 20:08:09 +02:00
|
|
|
Span
|
2024-02-26 07:00:51 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-17 03:24:17 +02:00
|
|
|
pub fn commands() -> Subscription<Command> {
|
|
|
|
|
Subscription::none()
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-26 07:00:51 +01:00
|
|
|
#[derive(Debug)]
|
2024-05-10 20:08:09 +02:00
|
|
|
pub struct Span;
|
2024-02-26 07:00:51 +01:00
|
|
|
|
2024-05-10 20:08:09 +02:00
|
|
|
impl Span {
|
2024-02-26 07:00:51 +01:00
|
|
|
pub fn finish(self) {}
|
|
|
|
|
}
|
|
|
|
|
}
|