Validated DNS zone file parser and analysis toolkit for MoonBit
import {
"lmclmc1/dns-zone-toolkit" @zone,
}
let document = @zone.parse_zone(
"$ORIGIN example.\n$TTL 1h\nwww A 192.0.2.1",
).unwrap()
println(@zone.render_zone(document))pub struct CnameResolution {
chain_values : Array[DomainName]
terminal_record_values : Array[ZoneRecord]
} derive(Eq, Debug)pub struct RecordChange {
kind_value : RecordChangeKind
left_value : ZoneRecord?
right_value : ZoneRecord?
} derive(Eq, Debug)pub(all) enum RecordData {
AData(Ipv4Address)
AaaaData(Ipv6Address)
NsData(DomainName)
CnameData(DomainName)
PtrData(DomainName)
MxData(MxRecordData)
TxtData(Array[String])
SrvData(SrvRecordData)
CaaData(CaaRecordData)
SoaData(SoaRecordData)
GenericData(GenericRecordData)
} derive(Eq, Debug)pub struct SoaRecordData {
primary_name_value : DomainName
responsible_name_value : DomainName
serial_value : UInt64
refresh_value : Ttl
retry_value : Ttl
expire_value : Ttl
minimum_value : Ttl
} derive(Eq, Debug)fn SourceSpan::range(start_line : Int, start_column : Int, end_line : Int, end_column : Int) -> SourceSpanpub struct SrvRecordData {
priority_value : Int
weight_value : Int
port_value : Int
target_value : DomainName
} derive(Eq, Debug)pub struct ZoneBatch {
item_values : Array[ZoneBatchItem]
accepted_count_value : Int
rejected_count_value : Int
parse_failed_count_value : Int
total_record_count_value : Int
} derive(Eq, Debug)pub struct ZoneBatchInput {
label_value : String
text_value : String
initial_origin_value : DomainName?
initial_ttl_value : Ttl?
} derive(Eq, Debug)fn ZoneBatchInput::new(label : String, text : String, initial_origin? : DomainName?, initial_ttl? : Ttl?) -> Result[ZoneBatchInput, ZoneError]pub struct ZoneBatchItem {
label_value : String
document_value : ZoneDocument?
validation_value : ZoneValidation?
statistics_value : ZoneStatistics?
parse_error_value : ZoneError?
} derive(Eq, Debug)pub struct ZoneComparison {
change_values : Array[RecordChange]
added_count_value : Int
removed_count_value : Int
ttl_changed_count_value : Int
data_changed_count_value : Int
} derive(Eq, Debug)pub(all) enum ZoneDirective {
OriginDirective(DomainName)
DefaultTtlDirective(Ttl)
} derive(Eq, Debug)pub struct ZoneDocument {
record_values : Array[ZoneRecord]
origin_value : DomainName?
default_ttl_value : Ttl?
directive_count_value : Int
} derive(Eq, Debug)pub struct ZoneError {
code_value : String
message_value : String
span_value : SourceSpan
} derive(Eq, Debug)pub(all) enum ZoneErrorCode {
InvalidCharacter
UnterminatedQuote
UnterminatedEscape
UnbalancedParenthesis
TokenLimitExceeded
InvalidDomainName
InvalidDomainLabel
DomainNameTooLong
RelativeNameWithoutOrigin
InvalidTtl
TtlOverflow
InvalidDirective
UnsupportedDirective
MissingRecordField
InvalidRecordClass
InvalidRecordType
InvalidRecordData
NumericFieldOutOfRange
DuplicateSingletonRecord
ConflictingCname
MissingSoa
MissingApexNs
IntegrityViolation
} derive(Eq, Debug)pub struct ZoneFinding {
code_value : String
severity_value : FindingSeverity
message_value : String
owner_value : DomainName?
} derive(Eq, Debug)pub struct ZoneIndex {
record_values : Array[ZoneRecord]
owner_values : Array[DomainName]
} derive(Eq, Debug)fn ZoneIndex::lookup(self : ZoneIndex, owner : DomainName, record_type : String) -> Array[ZoneRecord]fn ZoneIndex::resolve_cname(self : ZoneIndex, start : DomainName, max_hops? : Int) -> Result[CnameResolution, ZoneError]fn ZonePolicy::new(require_soa? : Bool, require_apex_ns? : Bool, enforce_cname_exclusive? : Bool, max_records? : Int?, max_ttl? : Ttl?) -> Result[ZonePolicy, ZoneError]pub struct ZoneRecord {
owner_value : DomainName
ttl_value : Ttl
class_value : String
type_value : String
data_value : RecordData
explicit_ttl_value : Bool
span_value : SourceSpan
} derive(Eq, Debug)pub struct ZoneRecordSet {
owner_value : DomainName
type_value : String
record_values : Array[ZoneRecord]
} derive(Eq, Debug)pub struct ZoneRecordSets {
set_values : Array[ZoneRecordSet]
record_count_value : Int
duplicate_count_value : Int
} derive(Eq, Debug)fn ZoneRecordSets::lookup(self : ZoneRecordSets, owner : DomainName, record_type : String) -> ZoneRecordSet?pub struct ZoneReference {
source_owner_value : DomainName
kind_value : ZoneReferenceKind
target_value : DomainName
internal_value : Bool
target_declared_value : Bool
address_available_value : Bool
requires_address_value : Bool
disabled_value : Bool
} derive(Eq, Debug)pub struct ZoneReferenceAnalysis {
reference_values : Array[ZoneReference]
internal_count_value : Int
external_count_value : Int
missing_target_count_value : Int
addressless_target_count_value : Int
disabled_count_value : Int
} derive(Eq, Debug)pub struct ZoneSelection {
document_value : ZoneDocument
selected_count_value : Int
excluded_count_value : Int
} derive(Eq, Debug)pub struct ZoneStatistics {
record_count_value : Int
owner_count_value : Int
type_count_values : Array[RecordTypeCount]
minimum_ttl_value : Ttl?
maximum_ttl_value : Ttl?
average_ttl_seconds_value : UInt64?
apex_record_count_value : Int
delegation_owner_count_value : Int
explicit_ttl_count_value : Int
} derive(Eq, Debug)pub struct ZoneToken {
text_value : String
quoted_value : Bool
span_value : SourceSpan
} derive(Eq, Debug)pub struct ZoneTtlRewrite {
document_value : ZoneDocument
changed_count_value : Int
unchanged_count_value : Int
} derive(Eq, Debug)pub struct ZoneValidation {
finding_values : Array[ZoneFinding]
record_count_value : Int
} derive(Eq, Debug)fn analyze_zone_references(zone : ZoneDocument, max_references? : Int) -> Result[ZoneReferenceAnalysis, ZoneError]fn build_zone_record_sets(zone : ZoneDocument, max_sets? : Int) -> Result[ZoneRecordSets, ZoneError]fn clamp_zone_ttls(zone : ZoneDocument, minimum? : Ttl?, maximum? : Ttl?) -> Result[ZoneTtlRewrite, ZoneError]fn compare_zones(left : ZoneDocument, right : ZoneDocument, max_changes? : Int) -> Result[ZoneComparison, ZoneError]fn lex_zone(text : String, max_tokens? : Int, max_token_bytes? : Int) -> Result[Array[ZoneStatement], ZoneError]fn parse_record_data(record_type : ZoneToken, fields : Array[ZoneToken], origin : DomainName) -> Result[RecordData, ZoneError]fn parse_record_data_statement(statement : ZoneStatement, origin : DomainName) -> Result[RecordData, ZoneError]fn parse_zone(text : String, initial_origin? : DomainName?, initial_ttl? : Ttl?, max_tokens? : Int, max_token_bytes? : Int) -> Result[ZoneDocument, ZoneError]fn parse_zone_directive(statement : ZoneStatement, current_origin? : DomainName?) -> Result[ZoneDirective, ZoneError]fn parse_zone_record(statement : ZoneStatement, origin : DomainName, inherited_owner? : DomainName?, inherited_ttl? : Ttl?) -> Result[ZoneRecord, ZoneError]fn process_zone_batch(inputs : Array[ZoneBatchInput], policy : ZonePolicy, max_items? : Int, max_total_text_units? : Int, max_tokens_per_item? : Int, max_token_bytes? : Int) -> Result[ZoneBatch, ZoneError]fn select_zone_records(zone : ZoneDocument, owner_subtree? : DomainName?, record_types? : Array[String]) -> Result[ZoneSelection, ZoneError]Validated DNS zone file parser and analysis toolkit for MoonBit