uni2work.workflows.visualiser/app/Index.hs
2023-08-24 04:35:35 +02:00

71 lines
2.7 KiB
Haskell

-- SPDX-FileCopyrightText: 2023 David Mosbach <david.mosbach@campus.lmu.de>
--
-- SPDX-License-Identifier: AGPL-3.0-or-later
{-# Language DuplicateRecordFields,
NoFieldSelectors,
OverloadedRecordDot,
OverloadedStrings,
DeriveGeneric #-}
module Index where
import Control.Applicative hiding (empty)
import GHC.Generics (Generic)
import Data.Map
import Data.Maybe (fromMaybe, fromJust)
import Data.Text (Text)
import YamlParser
type Index = Map Text Entry
data Entry = Entry {
graphFile :: Text,
category :: Maybe Text,
defScope :: Maybe Text,
defDescription :: Maybe Description,
instDescription :: Maybe Description,
instances :: YAMLNode
} deriving Show
instance FromYAML' Entry where
fromYAML (Mapping mapping _ _ _ _) = Entry
<$> mapping <| "graph-file"
<*> mapping <|? "category"
<*> mapping <|? "definition-scope"
<*> mapping <|? "definition-description"
<*> mapping <|? "instance-description"
<*> mapping <| "instances"
-- parseJSON _ = error "Unexpected yaml"
type Title = Text
type Content = Text
data Description = Description {
fallbackLang :: Maybe Text,
fallback :: (Maybe Title, Maybe Content),
translations :: Map Text (Maybe Title, Maybe Content)
} deriving Show
instance FromYAML' Description where
fromYAML (Mapping mapping _ _ _ _) = Description
<$> mapping <|? "fallback-lang"
<*> mapping <| "fallback"
<*> mapping <| "translations"
english = "en-eu";
getDefDescription :: Entry -> (Maybe Title, Maybe Content)
getDefDescription entry = let description = fromJust entry.defDescription
def = description.fallback
in findWithDefault def english description.translations
getInstDescription :: Entry -> (Maybe Title, Maybe Content)
getInstDescription entry = let description = fromJust entry.instDescription
def = description.fallback
in findWithDefault def english description.translations
getEntryByFile :: Text -> Index -> Entry
getEntryByFile file index = query (elems index) file where
query :: [Entry] -> Text -> Entry
query [] _ = error $ "No entries left for " ++ show file
query (x:xs) file = if x.graphFile == file then x else query xs file