module Language.Docker.Syntax.PortRange where


import Prettyprinter
import Language.Docker.Syntax.Port
import Language.Docker.Syntax.Protocol


-- | A port range starts and ends with either a number or a variable and can
-- have a protocol associated (tcp by default). The protocol of the start and
-- end port shall be ignored.
data PortRange
  = PortRange !Port !Port
  deriving (Int -> PortRange -> ShowS
[PortRange] -> ShowS
PortRange -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PortRange] -> ShowS
$cshowList :: [PortRange] -> ShowS
show :: PortRange -> String
$cshow :: PortRange -> String
showsPrec :: Int -> PortRange -> ShowS
$cshowsPrec :: Int -> PortRange -> ShowS
Show, PortRange -> PortRange -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PortRange -> PortRange -> Bool
$c/= :: PortRange -> PortRange -> Bool
== :: PortRange -> PortRange -> Bool
$c== :: PortRange -> PortRange -> Bool
Eq, Eq PortRange
PortRange -> PortRange -> Bool
PortRange -> PortRange -> Ordering
PortRange -> PortRange -> PortRange
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PortRange -> PortRange -> PortRange
$cmin :: PortRange -> PortRange -> PortRange
max :: PortRange -> PortRange -> PortRange
$cmax :: PortRange -> PortRange -> PortRange
>= :: PortRange -> PortRange -> Bool
$c>= :: PortRange -> PortRange -> Bool
> :: PortRange -> PortRange -> Bool
$c> :: PortRange -> PortRange -> Bool
<= :: PortRange -> PortRange -> Bool
$c<= :: PortRange -> PortRange -> Bool
< :: PortRange -> PortRange -> Bool
$c< :: PortRange -> PortRange -> Bool
compare :: PortRange -> PortRange -> Ordering
$ccompare :: PortRange -> PortRange -> Ordering
Ord)


instance Pretty PortRange where
  pretty :: forall ann. PortRange -> Doc ann
pretty (PortRange (Port Int
start Protocol
UDP) Port
end) = forall a ann. Pretty a => a -> Doc ann
pretty Int
start forall a. Semigroup a => a -> a -> a
<> Doc ann
"-" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Port
end forall a. Semigroup a => a -> a -> a
<> Doc ann
"/udp"
  pretty (PortRange (PortStr Text
start) (Port Int
end Protocol
UDP)) = forall a ann. Pretty a => a -> Doc ann
pretty Text
start forall a. Semigroup a => a -> a -> a
<> Doc ann
"-" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Int
end forall a. Semigroup a => a -> a -> a
<> Doc ann
"/udp"
  pretty (PortRange Port
start Port
end) = forall a ann. Pretty a => a -> Doc ann
pretty Port
start forall a. Semigroup a => a -> a -> a
<> Doc ann
"-" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Port
end