Refactoring: split SRV protocol in a dedicated module.

This commit is contained in:
Philippe Pittoli 2025-07-27 20:56:49 +02:00
parent 4b59d52684
commit 4b36b196ba
4 changed files with 46 additions and 35 deletions

View file

@ -13,7 +13,8 @@ import App.Validation.Email as Email
import App.Type.ResourceRecord.AcceptedRRTypes (AcceptedRRTypes(..)) import App.Type.ResourceRecord.AcceptedRRTypes (AcceptedRRTypes(..))
import App.Type.ResourceRecord.ResourceRecord (ResourceRecord, default_caa, default_rr, srv_protocols) import App.Type.ResourceRecord.ResourceRecord (ResourceRecord, default_caa, default_rr)
import App.Type.ResourceRecord.SRV as SRV
import App.Type.ResourceRecord.CAA as CAA import App.Type.ResourceRecord.CAA as CAA
import App.Type.ResourceRecord.DKIM as DKIM import App.Type.ResourceRecord.DKIM as DKIM
import App.Type.ResourceRecord.DMARC as DMARC import App.Type.ResourceRecord.DMARC as DMARC
@ -156,7 +157,7 @@ update_form form new_field_value =
new_caa = (fromMaybe default_caa form._rr.caa) { tag = new_tag, value = new_value } new_caa = (fromMaybe default_caa form._rr.caa) { tag = new_tag, value = new_value }
in form { _rr { caa = Just new_caa } } in form { _rr { caa = Just new_caa } }
SRV_Protocol v -> form { _rr { protocol = srv_protocols A.!! v } } SRV_Protocol v -> form { _rr { protocol = SRV.srv_protocols A.!! v } }
SPF_Mechanism_q v -> form { tmp { spf { mechanism_q = maybe "pass" id $ SPF.qualifier_types A.!! v }}} SPF_Mechanism_q v -> form { tmp { spf { mechanism_q = maybe "pass" id $ SPF.qualifier_types A.!! v }}}
SPF_Mechanism_t v -> form { tmp { spf { mechanism_t = maybe "a" id $ SPF.mechanism_types A.!! v }}} SPF_Mechanism_t v -> form { tmp { spf { mechanism_t = maybe "a" id $ SPF.mechanism_types A.!! v }}}
SPF_Mechanism_v v -> form { tmp { spf { mechanism_v = v }}} SPF_Mechanism_v v -> form { tmp { spf { mechanism_v = v }}}

View file

@ -3,13 +3,15 @@ module App.Type.ResourceRecord
, module App.Type.Form.ResourceRecord , module App.Type.Form.ResourceRecord
, module App.Type.ResourceRecord.AcceptedRRTypes , module App.Type.ResourceRecord.AcceptedRRTypes
, module App.Type.ResourceRecord.ResourceRecord , module App.Type.ResourceRecord.ResourceRecord
, module App.Type.ResourceRecord.SRV
) where ) where
import App.Type.Error.ResourceRecord import App.Type.Error.ResourceRecord
import App.Type.Form.ResourceRecord (Field(..), Form, RRUpdateValue(..), TMP, mkEmptyRRForm, update_form) import App.Type.Form.ResourceRecord (Field(..), Form, RRUpdateValue(..), TMP, mkEmptyRRForm, update_form)
import App.Type.ResourceRecord.AcceptedRRTypes (AcceptedRRTypes(..)) import App.Type.ResourceRecord.AcceptedRRTypes (AcceptedRRTypes(..))
import App.Type.ResourceRecord.ResourceRecord (RRId, ResourceRecord, SRVProtocol(..) import App.Type.ResourceRecord.ResourceRecord ( RRId, ResourceRecord
, codec, codecSRVProtocol, default_caa , codec, default_caa
, default_qualifier_str, default_rr , default_qualifier_str, default_rr, emptyRR)
, emptyRR, srv_protocols, srv_protocols_txt, str_to_srv_protocol)
import App.Type.ResourceRecord.SRV (Protocol(..), codecSRVProtocol, srv_protocols, srv_protocols_txt, str_to_srv_protocol)

View file

@ -1,11 +1,6 @@
module App.Type.ResourceRecord.ResourceRecord where module App.Type.ResourceRecord.ResourceRecord where
import Prelude (class Show, ($), (<>)) import Prelude (($), (<>))
-- import Data.String (toLower)
import Data.Generic.Rep (class Generic)
import App.Type.GenericSerialization (generic_serialization)
import Data.Show.Generic (genericShow)
import Data.Maybe (Maybe(..), maybe) import Data.Maybe (Maybe(..), maybe)
@ -19,6 +14,7 @@ import App.Type.ResourceRecord.CAA as CAA
import App.Type.ResourceRecord.DKIM as DKIM import App.Type.ResourceRecord.DKIM as DKIM
import App.Type.ResourceRecord.DMARC as DMARC import App.Type.ResourceRecord.DMARC as DMARC
import App.Type.ResourceRecord.SPF as SPF import App.Type.ResourceRecord.SPF as SPF
import App.Type.ResourceRecord.SRV as SRV
type RRId = Int type RRId = Int
@ -35,7 +31,7 @@ type ResourceRecord
-- SRV specific entries. -- SRV specific entries.
, port :: Maybe Int , port :: Maybe Int
, protocol :: Maybe SRVProtocol , protocol :: Maybe SRV.Protocol
, weight :: Maybe Int , weight :: Maybe Int
-- SOA specific entries. -- SOA specific entries.
@ -75,7 +71,7 @@ codec = CA.object "ResourceRecord"
-- SRV specific entries. -- SRV specific entries.
, port: CAR.optional CA.int , port: CAR.optional CA.int
, protocol: CAR.optional codecSRVProtocol , protocol: CAR.optional SRV.codecSRVProtocol
, weight: CAR.optional CA.int , weight: CAR.optional CA.int
-- SOA specific entries. -- SOA specific entries.
@ -139,26 +135,6 @@ emptyRR
, caa: Nothing , caa: Nothing
} }
data SRVProtocol = TCP | UDP
srv_protocols :: Array SRVProtocol
srv_protocols = [TCP, UDP]
srv_protocols_txt :: Array String
srv_protocols_txt = ["tcp", "udp"]
derive instance genericSRVProtocol :: Generic SRVProtocol _
instance showSRVProtocol :: Show SRVProtocol where
show = genericShow
-- | Codec for just encoding a single value of type `Qualifier`.
codecSRVProtocol :: CA.JsonCodec SRVProtocol
codecSRVProtocol = CA.prismaticCodec "SRVProtocol" str_to_srv_protocol generic_serialization CA.string
str_to_srv_protocol :: String -> Maybe SRVProtocol
str_to_srv_protocol = case _ of
"tcp" -> Just TCP
"udp" -> Just UDP
_ -> Nothing
default_qualifier_str = "hard_fail" :: String default_qualifier_str = "hard_fail" :: String
default_caa = { flag: 0, tag: CAA.Issue, value: "letsencrypt.org" } :: CAA.CAA default_caa = { flag: 0, tag: CAA.Issue, value: "letsencrypt.org" } :: CAA.CAA
@ -173,7 +149,7 @@ default_rr t domain =
MX -> emptyRR { rrtype = "MX", name = "mail", target = "server1", priority = Just 10 } MX -> emptyRR { rrtype = "MX", name = "mail", target = "server1", priority = Just 10 }
CAA -> emptyRR { rrtype = "CAA", name = "", target = "", caa = Just default_caa } CAA -> emptyRR { rrtype = "CAA", name = "", target = "", caa = Just default_caa }
SRV -> emptyRR { rrtype = "SRV", name = "voip", target = "server1" SRV -> emptyRR { rrtype = "SRV", name = "voip", target = "server1"
, port = Just 5061, weight = Just 100, priority = Just 10, protocol = Just TCP } , port = Just 5061, weight = Just 100, priority = Just 10, protocol = Just SRV.TCP }
SPF -> emptyRR { rrtype = "SPF", name = "", target = "" SPF -> emptyRR { rrtype = "SPF", name = "", target = ""
, mechanisms = Just default_mechanisms, q = Just SPF.HardFail } , mechanisms = Just default_mechanisms, q = Just SPF.HardFail }
DKIM -> emptyRR { rrtype = "DKIM", name = "default._domainkey", target = "" } DKIM -> emptyRR { rrtype = "DKIM", name = "default._domainkey", target = "" }

View file

@ -0,0 +1,32 @@
module App.Type.ResourceRecord.SRV where
import Prelude (class Show, ($), (<>))
import Data.Maybe (Maybe(..), maybe)
import Data.Generic.Rep (class Generic)
import App.Type.GenericSerialization (generic_serialization)
import Data.Show.Generic (genericShow)
import Data.Codec.Argonaut (JsonCodec)
import Data.Codec.Argonaut as CA
data Protocol = TCP | UDP
srv_protocols :: Array Protocol
srv_protocols = [TCP, UDP]
srv_protocols_txt :: Array String
srv_protocols_txt = ["tcp", "udp"]
derive instance genericSRVProtocol :: Generic Protocol _
instance showSRVProtocol :: Show Protocol where
show = genericShow
-- | Codec for just encoding a single value of type `Qualifier`.
codecSRVProtocol :: CA.JsonCodec Protocol
codecSRVProtocol = CA.prismaticCodec "SRVProtocol" str_to_srv_protocol generic_serialization CA.string
str_to_srv_protocol :: String -> Maybe Protocol
str_to_srv_protocol = case _ of
"tcp" -> Just TCP
"udp" -> Just UDP
_ -> Nothing