using System.Collections.Generic; using FluentResults; using Npgsql; namespace pgLabII.PgUtils.ConnectionStrings; public enum ConnStringFormat { Libpq, Npgsql, Url, Jdbc } public sealed class HostEndpoint { public string Host { get; init; } = string.Empty; public ushort? Port { get; init; } } /// /// Canonical, format-agnostic representation of a PostgreSQL connection. /// Keep minimal fields for broad interoperability; store extras in Properties. /// public sealed class ConnectionDescriptor { public string? Name { get; init; } // Primary hosts (support multi-host). If empty, implies localhost default. public IReadOnlyList Hosts { get; init; } = new List(); public string? Database { get; init; } public string? Username { get; init; } public string? Password { get; init; } public SslMode? SslMode { get; init; } // Common optional fields public string? ApplicationName { get; init; } public int? TimeoutSeconds { get; init; } // connect_timeout // Additional parameters preserved across conversions public IReadOnlyDictionary Properties { get; init; } = new Dictionary(); } /// /// Codec for a specific connection string format (parse and format only for its own format). /// Do not implement format specifics yet; provide interface only. /// public interface IConnectionStringCodec { ConnStringFormat Format { get; } string FormatName { get; } // Parse input in this codec's format into a descriptor. Result TryParse(string input); // Format a descriptor into this codec's format. Result TryFormat(ConnectionDescriptor descriptor); } /// /// High-level service to detect, parse, format and convert between formats. /// Implementations will compose specific codecs. /// public interface IConnectionStringService { Result DetectFormat(string input); Result ParseToDescriptor(string input); Result FormatFromDescriptor(ConnectionDescriptor descriptor, ConnStringFormat targetFormat); Result Convert(string input, ConnStringFormat targetFormat); }