packages feed

baikai-kit-0.1.0.1: src/Baikai/Kit/Manifest.hs

module Baikai.Kit.Manifest
  ( AgentEntry (..),
    KitItem (..),
    KitItemKind (..),
    KitManifest (..),
    SkillEntry (..),
    agentSources,
    itemKind,
    itemName,
    itemVersion,
    kitItemKind,
    kindLabel,
  )
where

import Baikai.Prelude
import Data.Text qualified as Text
import System.FilePath (takeFileName, (</>))

data KitManifest = KitManifest
  { version :: !Int,
    skills :: ![SkillEntry],
    agents :: ![AgentEntry]
  }
  deriving stock (Generic, Show)
  deriving anyclass (FromJSON)

data SkillEntry = SkillEntry
  { name :: !Text,
    description :: !Text,
    version :: !(Maybe Text),
    path :: !Text,
    files :: ![Text]
  }
  deriving stock (Generic, Show)
  deriving anyclass (FromJSON)

data AgentEntry = AgentEntry
  { name :: !Text,
    description :: !Text,
    version :: !(Maybe Text),
    path :: !Text,
    files :: !(Maybe [Text])
  }
  deriving stock (Generic, Show)
  deriving anyclass (FromJSON)

data KitItem
  = KitSkillItem !SkillEntry
  | KitAgentItem !AgentEntry
  deriving stock (Generic, Show)

data KitItemKind
  = SkillKind
  | AgentKind
  deriving stock (Eq, Ord, Show)

agentSources :: AgentEntry -> [(FilePath, FilePath)]
agentSources entry =
  case entry ^. #files of
    Just fs -> [(Text.unpack (entry ^. #path) </> Text.unpack f, Text.unpack f) | f <- fs]
    Nothing ->
      let source = Text.unpack (entry ^. #path)
       in [(source, takeFileName source)]

itemName :: KitItem -> Text
itemName (KitSkillItem entry) = entry ^. #name
itemName (KitAgentItem entry) = entry ^. #name

itemKind :: KitItem -> Text
itemKind KitSkillItem {} = "skill"
itemKind KitAgentItem {} = "agent"

kitItemKind :: KitItem -> KitItemKind
kitItemKind KitSkillItem {} = SkillKind
kitItemKind KitAgentItem {} = AgentKind

kindLabel :: KitItemKind -> Text
kindLabel SkillKind = "skill"
kindLabel AgentKind = "agent"

itemVersion :: KitItem -> Maybe Text
itemVersion (KitSkillItem entry) = entry ^. #version
itemVersion (KitAgentItem entry) = entry ^. #version