// SzfFieldWriter.cs
using System.Text;
namespace SessionZero.Data;
///
/// Helper class to write fields to a StringBuilder following SZF format,
/// respecting generator options like indentation.
///
public class SzfFieldWriter
{
public readonly StringBuilder Builder;
public readonly SzfGeneratorOptions Options;
public SzfFieldWriter(StringBuilder builder, SzfGeneratorOptions options)
{
Builder = builder;
Options = options;
}
///
/// Writes a generic field with a string type.
///
public void WriteField(string name, string type, object? value)
{
if (!Options.IncludeEmptyFields && (value == null || string.IsNullOrEmpty(value.ToString())))
{
return; // Skip empty fields if option is set
}
var formattedValue = FormatFieldValue(value, type);
if (Options.IndentFields)
{
Builder.AppendLine($"{Options.Indent}{name} ({type}) = {formattedValue}");
}
else
{
Builder.AppendLine($"{name} ({type}) = {formattedValue}");
}
}
///
/// Writes a field with a DatasetFieldType.
///
public void WriteField(string name, DatasetFieldType type, object? value)
{
var typeString = type switch
{
DatasetFieldType.Text => "text",
DatasetFieldType.TextField => "text-field",
DatasetFieldType.Number => "number",
DatasetFieldType.Boolean => "bool",
DatasetFieldType.Group => "group",
DatasetFieldType.Calculated => "calculated",
DatasetFieldType.System => "system",
DatasetFieldType.DatasetReference => "dataset-reference",
DatasetFieldType.DatasetType => "dataset-type",
DatasetFieldType.DatasetReferenceMultiple => "dataset-reference-multiple",
DatasetFieldType.DatasetTypeMultiple => "dataset-type-multiple",
_ => "text" // Default or unknown types
};
WriteField(name, typeString, value);
}
///
/// Formats field values based on their declared type for SZF output.
///
private string FormatFieldValue(object? value, string fieldType)
{
if (value == null)
return string.Empty;
return fieldType.ToLower() switch
{
"bool" => (bool)value ? "true" : "false",
"number" => value.ToString() ?? "0",
_ => value.ToString() ?? string.Empty
};
}
///
/// Appends a new line to the string builder.
///
public void AppendLine()
{
Builder.AppendLine();
}
///
/// Appends a section header to the string builder.
///
public void AppendSectionHeader(string header)
{
Builder.AppendLine($"[{header}]");
}
}