using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace IFPSLib
{
///
/// Represents additional type/function metadata, similar to .NET attributes.
///
public class CustomAttribute
{
///
/// Attribute type name
///
public string Name { get; set; }
///
/// Attribute arguments (indexed by constructor argument number).
///
public IList Arguments { get; internal set; } = new List();
public CustomAttribute(string name)
{
Name = name;
}
internal static IList LoadList(BinaryReader br, Script script)
{
var listLen = br.Read();
var ret = new List(listLen);
for (int idxAttr = 0; idxAttr < listLen; idxAttr++)
{
var nameLen = br.Read();
var attr = new CustomAttribute(br.ReadAsciiString(nameLen));
var argsLen = br.Read();
attr.Arguments = new List(argsLen);
for (int idxArg = 0; idxArg < argsLen; idxArg++)
{
attr.Arguments.Add(TypedData.Load(br, script));
}
ret.Add(attr);
}
return ret;
}
internal static void SaveList(BinaryWriter bw, IList list, Script.SaveContext ctx)
{
bw.Write(list.Count);
for (int idxAttr = 0; idxAttr < list.Count; idxAttr++)
{
var attr = list[idxAttr];
bw.WriteAsciiString(attr.Name.ToUpper(), true);
bw.Write(attr.Arguments.Count);
for (int idxArg = 0; idxArg < attr.Arguments.Count; idxArg++)
{
attr.Arguments[idxArg].Save(bw, ctx);
}
}
}
public override string ToString()
{
var sb = new StringBuilder("[");
sb.Append(Name);
sb.Append('(');
for (int i = 0; i < Arguments.Count; i++)
{
if (i != 0) sb.Append(", ");
sb.Append(Arguments[i]);
}
sb.Append(")]");
return sb.ToString();
}
}
}