using Qrakhen.Qamp.Core.Execution; using System.Text; namespace Qrakhen.Qamp.Core.Values.Objects; public class Function(string name, Segment segment, int outerCount, int argumentCount) : Obj(ValueType.Function) { public readonly string Name = name; public Segment Segment = segment; public readonly int OuterCount = outerCount; public readonly int ArgumentCount = argumentCount; public override string ToString() => $"{Name}()"; public byte[] Serialize(bool topLevel = false) { List result = [ .. string.IsNullOrEmpty(Name) ? [] : Encoding.ASCII.GetBytes(Name), 0, (byte)ArgumentCount, .. OuterCount.GetBytes(), .. Segment.Serialize() ]; if (topLevel) { result.AddRange([0xFF, 0xF0]); result.AddRange(String.SerializeStrings()); result.AddRange([0x0F, 0xFF, 0xFF, 0xF1]); result.AddRange(Ptr.SerializeFunctions()); result.AddRange([0x0F, 0xFF]); } return result.ToArray(); } } // local c# function, so compiled inside the binary already // cheap shortcut for global methods for now. public class NativeFunction(string name, Func target, params string[] arguments) : Obj(ValueType.Native) { public string Name { get; } = name; public Func Target { get; } = target; public string[] Arguments { get; } = arguments; public override string ToString() => $"[NativeFunction <{Name}> ({string.Join(", ", Arguments)})]"; }