summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Types.hs
blob: 02e6fedc375f60fe25bc2fb2fe23ba36ab9efc9b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
{-# LANGUAGE OverloadedStrings #-}

module Language.Fiddle.Types where

import Data.Aeson
import Data.Maybe
import Data.Text (Text, pack, splitOn, unpack)
import Text.Parsec.Pos

data Comment = NormalComment Text | DocComment Text
  deriving (Show)

data SourceSpan = SourceSpan
  { sourceStart :: !SourcePos,
    sourceStop :: !SourcePos
  }
  deriving (Eq, Ord, Show)

data Commented a = Commented {comments :: ![Comment], unCommented :: !a}
  deriving (Show)

docComments :: Commented a -> Text
docComments =
  mconcat
    . mapMaybe
      ( \case
          (DocComment t) -> Just t
          _ -> Nothing
      )
    . comments

-- Helper to create the compressed span string
formatSpan :: SourceSpan -> String
formatSpan (SourceSpan ss se) =
  let sl = sourceLine ss
      sc = sourceColumn ss
      fname = sourceName ss
      el = sourceLine se
      ec = sourceColumn se
   in fname ++ ":" ++ show sl ++ ":" ++ show sc ++ "-" ++ show el ++ ":" ++ show ec

-- Helper to parse the compressed span string
parseSpan :: String -> Maybe (String, Int, Int, Int, Int)
parseSpan str = do
  let parts = map (splitOn ":") $ splitOn "-" (pack str)

  case parts of
    [[fname, sl, sc], [el, ec]] ->
      Just (unpack fname, read $ unpack sl, read $ unpack sc, read $ unpack el, read $ unpack ec)
    _ -> Nothing

-- ToJSON and FromJSON instances
instance ToJSON SourceSpan where
  toJSON srcSpan =
    object
      ["span" .= formatSpan srcSpan]

instance FromJSON SourceSpan where
  parseJSON = withObject "SourceSpan" $ \v -> do
    spanStr <- v .: "span"
    case parseSpan spanStr of
      Just (fname, sl, sc, el, ec) ->
        return $ SourceSpan (newPos fname sl sc) (newPos fname el ec)
      Nothing -> fail "Invalid span format"