IRecordType
IRecordType is interface for record descriptions.
/// <summary>Description of record</summary>
/// <remarks>Valid record has <see cref="IFieldContainerType.Fields"/> assigned.</remarks>
public interface IRecordType : IDataType, IFieldContainerType, IInheritable<IDataType>, ICyclical
{
}
/// <summary>Data type feature that is capable describing inheritance or multi-inheritance.</summary>
public interface IInheritable<T>
{
/// <summary>Parent types. Fields are inherited from parent types.</summary>
T[] Parents { get; set; }
}
/// <summary>Interface for datatypes that hold <see cref="IFieldType"/>.</summary>
public interface IFieldContainerType : IDataType
{
/// <summary>List of fields.</summary>
//[RequiredMember]
IFieldType[] Fields { get; set; }
}
IDataType └── IRecordType
RecordType is the default implementation.
IRecordType recordType = new RecordType
{
Name = Identities.CreateNamespace("Namespace").AppendName("Name").SetReadOnly(),
Annotations = { },
Description = "",
Unassignable = true,
Referable = true,
Parents = new IDataType[0],
Fields = new IFieldType[]
{
new FieldType
{
Name = Identities.CreateName("Name"),
Value = DataTypes.String.Instance
}.SetReadOnly()
}
}.SetReadOnly();
Namespace.Name : IRecordType └── Fields[0] = Name : IFieldType └── Value = string : IStringType └── Element = char : IIntegerType
RecordType should be assigned read-only once initialization is completed. Two phase initialization is needed for constructing cyclical descriptions.
// Node[]
ListType nodeListType = new ListType
{
Name = null,
Annotations = { },
Description = "Forward edges",
Referable = true,
Unassignable = false,
Element = null! // To be assigned later
};
// Node { Edges = Node[] }
IRecordType nodeType = new RecordType
{
Name = Identities.CreateName("Node").SetReadOnly(),
Annotations = { },
Description = "Graph Node",
Unassignable = true,
Referable = true,
Parents = new IDataType[0],
Fields = new IFieldType[]
{
new FieldType
{
Name = Identities.CreateName("Edges"),
Value = nodeListType
}.SetReadOnly()
}
}.SetReadOnly();
// Assign element
nodeListType.SetElement(nodeType).SetReadOnly();
Node : IRecordType └── Fields[0] = Edges : IFieldType └── Value = IListType └── Element = Node : IRecordType
RecordTypeRequest is request for a record type when sub-requests are needed.
// Create service
IService service = Services.Create(NetTypeHandlers.Instance);
// Create request
RecordTypeRequest request = new RecordTypeRequest
{
Name = Identities.CreateName("MyRecord"),
Annotations = new Dictionary<string, string> { { IDataType.Annotation.Description, "Graph node" } },
Unassignable = null,
Referable = null,
Parents = new object[] { },
Fields = new object[] {
new FieldTypeRequest
{
Name = Identities.CreateName("Name"),
Value = DataTypes.String.Instance
}
}
};
// Query
IRecordType datatype = service.GetRequired<RecordTypeRequest, IRecordType>(request);
MyRecord : IRecordType └── Fields[0] = Name : IFieldType └── Value = string : IStringType └── Element = char : IIntegerType
Full Example
Full example
using System.Collections.Generic;
using System.ComponentModel;
using Avalanche.DataType;
using Avalanche.Identity;
using Avalanche.Service;
using Avalanche.Utilities;
using static System.Console;
public class recordtype
{
public static void Run()
{
{
// <01>
IRecordType recordType = new RecordType
{
Name = Identities.CreateNamespace("Namespace").AppendName("Name").SetReadOnly(),
Annotations = { },
Description = "",
Unassignable = true,
Referable = true,
Parents = new IDataType[0],
Fields = new IFieldType[]
{
new FieldType
{
Name = Identities.CreateName("Name"),
Value = DataTypes.String.Instance
}.SetReadOnly()
}
}.SetReadOnly();
// </01>
// Print
WriteLine(recordType.PrintTree());
WriteLine(recordType.PrintTree(format: DataTypePrintTreeExtensions.PrintFormat.DefaultLong));
}
{
// <02>
// Node[]
ListType nodeListType = new ListType
{
Name = null,
Annotations = { },
Description = "Forward edges",
Referable = true,
Unassignable = false,
Element = null! // To be assigned later
};
// Node { Edges = Node[] }
IRecordType nodeType = new RecordType
{
Name = Identities.CreateName("Node").SetReadOnly(),
Annotations = { },
Description = "Graph Node",
Unassignable = true,
Referable = true,
Parents = new IDataType[0],
Fields = new IFieldType[]
{
new FieldType
{
Name = Identities.CreateName("Edges"),
Value = nodeListType
}.SetReadOnly()
}
}.SetReadOnly();
// Assign element
nodeListType.SetElement(nodeType).SetReadOnly();
// </02>
// Print
WriteLine(nodeType.PrintTree());
}
{
// <03>
// Create service
IService service = Services.Create(NetTypeHandlers.Instance);
// Create request
RecordTypeRequest request = new RecordTypeRequest
{
Name = Identities.CreateName("MyRecord"),
Annotations = new Dictionary<string, string> { { IDataType.Annotation.Description, "Graph node" } },
Unassignable = null,
Referable = null,
Parents = new object[] { },
Fields = new object[] {
new FieldTypeRequest
{
Name = Identities.CreateName("Name"),
Value = DataTypes.String.Instance
}
}
};
// Query
IRecordType datatype = service.GetRequired<RecordTypeRequest, IRecordType>(request);
// </03>
// Print
WriteLine(datatype.PrintTree());
}
}
}