snippet-0.1.0.3: src/Snippet.hs
-- |
--
-- Module : Snippet
-- Copyright : (c) 2026 Patrick Brisbin
-- License : AGPL-3
-- Maintainer : pbrisbin@gmail.com
-- Stability : experimental
-- Portability : POSIX
module Snippet
( Region (..)
, Snippet
, snippetFromFile
, snippetFromContents
) where
import Prelude
import Data.List.NonEmpty (NonEmpty, nonEmpty)
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack)
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Snippet.Line
import Snippet.Region
import Snippet.Snippet
import System.Directory (doesFileExist)
snippetFromFile :: Region -> FilePath -> IO (Maybe Snippet)
snippetFromFile region path = do
exists <- doesFileExist path
if exists
then do
contents <- T.readFile path
let -- Show only the lines of the region
mSourceLines =
nonEmpty
$ drop (sl - 1)
$ take el
$ T.lines contents
pure $ snippetFromContents region (pack path) Nothing <$> mSourceLines
else pure Nothing
where
sl = region.startLine
el = fromMaybe sl region.endLine
snippetFromContents
:: Region
-> Text
-- ^ URI
-> Maybe Int
-- ^ Explicit start line, if not the region's
-> NonEmpty Text
-- ^ Code lines
-> Snippet
snippetFromContents region uri mStartLine sourceLines = do
Snippet
{ uri
, region
, lines = linesFromRegion region mStartLine sourceLines
}