using System.Runtime.InteropServices; namespace VoiceCat.Interop; /// /// Managed copy of a vc_event — safe to hold/queue past the native callback's return (unlike /// VcEventNative, whose Text pointer is only valid during the callback). /// public sealed record VoiceCatEvent( VcEventType Type, VcConnectionState ConnectionState, VcResult Result, uint UserId, uint ChannelId, uint StreamId, VcTextScope TextScope, uint U32a, string? Text, ulong TimestampUnixMs) { internal static VoiceCatEvent FromNative(in VcEventNative ev) => new( ev.Type, ev.ConnectionState, (VcResult)ev.Result, ev.UserId, ev.ChannelId, ev.StreamId, ev.TextScope, ev.U32a, ev.Text == IntPtr.Zero ? null : Marshal.PtrToStringUTF8(ev.Text), ev.TimestampUnixMs); }