packages feed

kit-0.4: Kit/XCode/PBXProject.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Kit.XCode.PBXProject where

import Kit.XCode.OldPList
import Control.Monad.State
import Control.Monad.Writer

type UUID = String

data PBXProject = PBXProject {
    projectConfigurationList :: XCConfigurationList
  , projectGroups :: [PBXGroup]
  , projectName :: String
}

data XCConfigurationList = XCConfigurationList {
  configurationsList :: [XCBuildConfiguration]
}

data PBXGroup = PBXGroup {
    groupChildren :: [PBXGroup]
  , groupChildrenExtra :: [UUID]
  , groupName :: String
  , groupSourceTree :: String
}

data XCBuildConfiguration = XCBuildConfiguration

instance ProjectPListItem PBXGroup where
  writeEntry group = do
    childUUIDs <- mapM writeEntry (groupChildren group)
    write $ obj [
          "isa" ~=~ val "PBXGroup"
        , "name" ~=~ (val . groupName) group
        , "sourceTree" ~=~ (val . groupSourceTree) group
        , "children" ~=~ (arr $ map val (childUUIDs ++ groupChildrenExtra group))
      ]

type PLObjects = [(UUID, PListType)]
-- Consume UUIDs from state, write out other objects to be added to the plist
newtype PL a = PL { unPL :: WriterT PLObjects (State [UUID]) a }
              deriving (Monad, MonadState [UUID], MonadWriter PLObjects)

class ProjectPListItem a where
  writeEntry :: a -> PL UUID

popS = do
  (x:xs) <- get
  put xs
  return x

write blah = do
  uuid <- popS
  tell [(uuid, blah)]
  return uuid

instance ProjectPListItem PBXProject where
  writeEntry project = do
    config <- write $ val "TODO"
    productGroupUUID <- writeEntry (PBXGroup [] [] "Products" "<group>")
    mainGroupUUID <- writeEntry (PBXGroup [] [productGroupUUID] (projectName project) "<group>")
    write $ obj [
        "isa" ~=~ val "PBXProject"
      , "buildConfigurationList" ~=~ val config
      , "compatibilityVersion" ~=~ val "Xcode 3.1"
      , "hasScannedForEncodings" ~=~ val "1"
      , "mainGroup" ~=~ val mainGroupUUID
      , "productRefGroup" ~=~ val productGroupUUID
      , "projectDirPath" ~=~ val ""
      , "projectRoot" ~=~ val ""
      , "targets" ~=~ arr []
     ]