summaryrefslogtreecommitdiff
path: root/vdv-server/VDV452.hs
diff options
context:
space:
mode:
Diffstat (limited to 'vdv-server/VDV452.hs')
-rw-r--r--vdv-server/VDV452.hs95
1 files changed, 60 insertions, 35 deletions
diff --git a/vdv-server/VDV452.hs b/vdv-server/VDV452.hs
index e8840ce..0d24934 100644
--- a/vdv-server/VDV452.hs
+++ b/vdv-server/VDV452.hs
@@ -1,16 +1,41 @@
{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- |
module VDV452 where
+
+import qualified Data.Text as T
+import Data.ByteString (ByteString)
import Data.Time (Day)
import Data.Text (Text)
-import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber), Longitude, Latitude)
-import Data.ByteString (ByteString)
-
+import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), Longitude, Latitude)
+
+newtype BereichNr = BereichNr Int
+ deriving newtype ÖPNVEncode
+newtype LineVariant = LineVariant Text
+ deriving newtype ÖPNVEncode
+newtype SteigNr = SteigNr Int
+ deriving newtype ÖPNVEncode
+newtype OrtRefOrt = OrtRefOrt Int
+ deriving newtype ÖPNVEncode
+
+-- see mail correspondence with Mentz, 2023-03-06
+data OrtNr = OrtNr { ortRef :: OrtRefOrt, steigNr :: SteigNr }
+instance ÖPNVEncode OrtNr where
+ encode (OrtNr (OrtRefOrt ort) (SteigNr steig)) =
+ encode (ort * 100 + steig)
+
+-- | this should technically be in its own file VDV432.hs
+-- prefix enthält alle Felder bis Bereich-ID; SteigNr ist die Mast-ID
+-- Halteposition wird hier nicht benutzt.
+data DHID = DHID Text SteigNr
+instance ÖPNVEncode DHID where
+ encode (DHID prefix (SteigNr steig)) =
+ encode (prefix <> ":" <> (T.pack . show) steig)
-- | 993
data BasisVerGueltigkeit = BasisVerGueltigkeit
@@ -24,7 +49,7 @@ instance ÖPNVDatum BasisVerGueltigkeit where
tableName _ = "BASIS_VER_GUELTIGKEIT"
tableNumber _ = 993
tableSchema _ =
- [ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit)
+ [ ("VER_GUELTIGKEIT", ÖNum 8, F . basisVerGueltigkeit)
, ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)]
-- | 485
@@ -136,8 +161,8 @@ instance ÖPNVDatum MengeOrtTyp where
data RecHp = RecHp
{ rechpBasisVersion :: Int
, rechpOnrTypNr :: OrtTypNr
- , rechpOrtNr :: Int
- , rechpHaltepunktNr :: Int
+ , rechpOrtNr :: OrtNr
+ , rechpHaltepunktNr :: SteigNr
, rechpZusatzInfo :: Text
}
@@ -156,7 +181,7 @@ data RecOm = RecOm
{ recomBasisVersion :: Int
, recomOnrTypNr :: OnrTypNr
-- ^ nur 3..4
- , recomOrtNr :: Int
+ , recomOrtNr :: OrtNr
, recomOrmKuerzel :: Text
, recomOrmacode :: Int
, recomOrmText :: Text
@@ -178,13 +203,13 @@ instance ÖPNVDatum RecOm where
data RecOrt = RecOrt
{ recortBasisVersion :: Int
, recortOnrTypNr :: OnrTypNr
- , recortOrtNr :: Int
+ , recortOrtNr :: OrtNr
, recortOrtName :: Text
, recortHastNrLokal :: Int
, recortHstNrNational :: Int
- , recortHstNrInternational :: Text
+ , recortHstNrInternational :: DHID
-- these only if recortOnrTypNr = 1 or 2
- , recortOrtRefOrt :: Int
+ , recortOrtRefOrt :: OrtRefOrt
, recortOrtRefOrtTyp :: OrtTypNr
, recortOrtRefOrtLangNr :: Maybe Int
, recortOrtRefOrtKuerzel :: Text
@@ -266,7 +291,7 @@ instance ÖPNVDatum ZulVerkehsbetrieb where
-- | 333
data MengeBereich = MengeBereich
{ mengebereichBasisVersion :: Int
- , mengebereichBereichNr :: Int
+ , mengebereichBereichNr :: BereichNr
, mengebereichStrBereich :: Text
, mengebereichBereichText :: Text
}
@@ -374,13 +399,13 @@ instance ÖPNVDatum RecZnr where
-- 299
data RecSel = RecSel
{ recselBasisVersion :: Int
- , recselBereichNr :: Int
+ , recselBereichNr :: BereichNr
-- ^ fremdschlüssel MangeBereich
, recselOnrTypNr :: OnrTypNr
-- ^ fremdschlüssel MengeOnrTyp
- , recselOrtNr :: Int
+ , recselOrtNr :: OrtNr
-- ^ fremdschlüssel RecOrt
- , recselSelZiel :: Int
+ , recselSelZiel :: OrtNr
, recselSelZielTyp :: OrtTypNr
, recselSelLaenge :: Int
}
@@ -404,9 +429,9 @@ instance ÖPNVDatum RecSel where
-- honestly i hope this one's optional
data RecSelZp = RecSelZp
{ recselzpBasisVersion :: Int
- , recselzpBereichNr :: Int
+ , recselzpBereichNr :: BereichNr
, recselzpOnrTypNr :: OrtTypNr
- , recselzpOrtNr :: Int
+ , recselzpOrtNr :: OrtNr
, recselzpSelZiel :: Int
, recselzpSelZielTyp :: OrtTypNr
, recselzpZpOnr :: Int
@@ -458,7 +483,7 @@ data OrtHztf = OrtHztf
{ orthztfBasisVersion :: Int
, orthztfFgrNr :: Int
, orthztfOnrTypNr :: OrtTypNr
- , orthztfOrtNr :: Int
+ , orthztfOrtNr :: OrtNr
, orthztfHpHzt :: Int
}
@@ -477,11 +502,11 @@ instance ÖPNVDatum OrtHztf where
-- nie als fremdschlüssel benutzt, ist optional
data SelFztFeld = SelFztFeld
{ selfztBasisVersion :: Int
- , selfztBereichNr :: Int
+ , selfztBereichNr :: BereichNr
, selfztFgrNr :: Int
, selfztOnrTypNr :: OrtTypNr
- , selfztOrtNr :: Int
- , selfztSelZiel :: Int
+ , selfztOrtNr :: OrtNr
+ , selfztSelZiel :: OrtNr
, selfztSelZielTyp :: OrtTypNr
, selfztSelFzt :: Int
}
@@ -503,9 +528,9 @@ instance ÖPNVDatum SelFztFeld where
-- | 225: keine ahnung, irgendwas halt
data RecUeb = RecUeb
{ recuebBasisVersion :: Int
- , recuebBereichNr :: Int
+ , recuebBereichNr :: BereichNr
, recuebOnrTypNr :: OrtTypNr
- , recuebOrtNr :: Int
+ , recuebOrtNr :: OrtNr
, recuebZielTyp :: OrtTypNr
, recuebZiel :: Int
, recuebLaenge :: Int
@@ -528,10 +553,10 @@ instance ÖPNVDatum RecUeb where
-- nirgendwo anders benutzt, ist wohl optional
data UebFzt = UebFzt
{ uebfztBasisVersion :: Int
- , uebfztBereichNr :: Int
+ , uebfztBereichNr :: BereichNr
, uebfztFgrNr :: Int
, uebfztOnrTypNr :: OrtTypNr
- , uebfztOrtNr :: Int
+ , uebfztOrtNr :: OrtNr
, uebfztZielTyp :: OrtTypNr
, uebfztZiel :: Int
, uebfztFahrzeit :: Int
@@ -601,7 +626,7 @@ data FlZoneOrt = FlZoneOrt
, flzoneTypNr :: Int
, flzoneNr :: Int
, flzoneOnrTypNr :: OnrTypNr
- , flzoneOrtNr :: Int
+ , flzoneOrtNr :: OrtNr
}
instance ÖPNVDatum FlZoneOrt where
@@ -643,10 +668,10 @@ instance ÖPNVDatum MengeFlaechenZoneTyp where
-- nirgendwo fremdschlüssel, optional
data SelFztFeldZp = SelFztFeldZp
{ selfztfeldBasisVersion :: Int
- , selfztfeldBereichNr :: Int
+ , selfztfeldBereichNr :: BereichNr
, selfztfeldFgrNr :: Int
, selfztfeldOnrTypNr :: OrtTypNr
- , selfztfeldOrtNr :: Int
+ , selfztfeldOrtNr :: OrtNr
, selfztfeldSelZiel :: Int
, selfztfeldSelZielTyp :: Int
-- this one can only be 1 or 2??
@@ -681,9 +706,9 @@ data LidVerlauf = LidVerlauf
{ verlaufBasisVersion :: Int
, verlaufLfdNr :: Int
, verlaufNr :: Int
- , verlaufStrLiVar :: Text
+ , verlaufStrLiVar :: LineVariant
, verlaufOnrTypNr :: OrtTypNr
- , verlaufOrtNr :: Int
+ , verlaufOrtNr :: OrtNr
, verlaufZnrNr :: Int
, verlaufAnrNr :: Maybe Int
, verlaufEinfangbereich :: Int
@@ -720,11 +745,11 @@ instance ÖPNVDatum LidVerlauf where
data RecLid = RecLid
{ reclidBasisVersion :: Int
, reclidLiNr :: Int
- , reclidStrLiVar :: Text
+ , reclidStrLiVar :: LineVariant
, reclidRoutenNr :: Int
, reclidLiRiNr :: Int
-- ^ 1..2
- , reclidBereichNr :: Int
+ , reclidBereichNr :: BereichNr
, reclidLiKuerzel :: Text
, reclidLidname :: Text
, reclidRoutenArt :: Fahrtart
@@ -763,7 +788,7 @@ data RecFrt = RecFrt
, recfrtLiKuNr :: Maybe Int
, recfrtFahrtartNr :: Fahrtart
, recfrtFgrNr :: Int
- , recfrtStrLiVar :: Text
+ , recfrtStrLiVar :: LineVariant
, recfrtUmUid :: Maybe Int
, recfrtZugNr :: Int
, recfrtDurchbiFrtStart :: Bool
@@ -799,7 +824,7 @@ data RecFrtHzt = RecFrtHzt
{ recfrthztBasisVersion :: Int
, recfrthztFid :: Int
, recfrthztOnrTypNr :: OrtTypNr
- , recfrthztOrtNr :: Int
+ , recfrthztOrtNr :: OrtNr
, recfrthztZeit :: Int
}
@@ -855,7 +880,7 @@ data Einzelanschluss = Einzelanschluss
, einzelZubLiRiNr :: Richtung
, einzelZubOrtRefOrt :: Int
, einzelZubOnrTypNr :: Maybe OnrTypNr
- , einzelZubOrtNr :: Maybe Int
+ , einzelZubOrtNr :: Maybe OrtNr
, einzelVonOrtRefOrt :: Maybe Int
, einzelLinienId :: Text
, einzelRichtungsId :: Text