using ZB.MOM.WW.OtOpcUa.AdminUI.Uns.TagEditors;
namespace ZB.MOM.WW.OtOpcUa.AdminUI.Components.Shared.Drivers.DeviceForms;
///
/// Typed working model for a TwinCAT Device's connection endpoint (the v3 endpoint→DeviceConfig
/// split). Authors the PascalCase HostAddress key (the AMS Net Id:port host string) that
/// TwinCATDeviceOptions binds — the exact casing the seed and runtime probe
/// (PropertyNameCaseInsensitive) expect. Preserves unrecognised keys across a load→save.
///
public sealed class TwinCATDeviceModel
{
/// AMS Net Id:port host string (e.g. 192.168.0.1.1.1:851).
public string HostAddress { get; set; } = "";
private System.Text.Json.Nodes.JsonObject _bag = new();
/// Loads a model from a DeviceConfig JSON string, defaulting absent keys and retaining
/// every original key so fields this editor doesn't expose survive a load→save.
/// The raw DeviceConfig JSON string, or null for a new/empty device.
/// The populated .
public static TwinCATDeviceModel FromJson(string? json)
{
var o = TagConfigJson.ParseOrNew(json);
return new TwinCATDeviceModel
{
HostAddress = TagConfigJson.GetString(o, "HostAddress") ?? "",
_bag = o,
};
}
/// Serializes this model back to a DeviceConfig JSON string, writing the PascalCase endpoint
/// key over the preserved key bag.
/// The serialised DeviceConfig JSON string.
public string ToJson()
{
TagConfigJson.Set(_bag, "HostAddress", HostAddress);
return TagConfigJson.Serialize(_bag);
}
/// Validation hook; returns an error message or null when the model is valid.
/// An error message describing the validation failure, or null when the model is valid.
public string? Validate()
=> string.IsNullOrWhiteSpace(HostAddress) ? "Host address is required." : null;
}