diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ba5651 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +test/**/*.nix linguist-vendored diff --git a/main/Main.hs b/main/Main.hs index c8280d2..2ec4e09 100644 --- a/main/Main.hs +++ b/main/Main.hs @@ -12,6 +12,7 @@ import Data.ByteString.Char8 (unpack) import Data.Either (lefts) import Data.FileEmbed import Data.List (isSuffixOf) +import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text.IO as TextIO (getContents, hPutStr, putStr) import Data.Version (showVersion) @@ -50,7 +51,8 @@ data Nixfmt = Nixfmt strict :: Bool, verify :: Bool, ast :: Bool, - ir :: Bool + ir :: Bool, + filename :: Maybe FilePath } deriving (Show, Data, Typeable) @@ -81,7 +83,12 @@ options = ir = False &= help - "Pretty print the internal intermediate representation, only for debugging" + "Pretty print the internal intermediate representation, only for debugging", + filename = + Nothing + &= help + "The filename to display when the file input is given through stdin.\n\ + \Useful for tools like editors and autoformatters that wish to use Nixfmt without providing it direct file access, while still providing context to where the file is." } &= summary ("nixfmt " ++ versionFromFile) &= help "Format Nix source code" @@ -137,8 +144,8 @@ checkTarget format Target{tDoRead, tPath} = do | formatted == contents -> Right () | otherwise -> Left $ tPath ++ ": not formatted" -stdioTarget :: Target -stdioTarget = Target TextIO.getContents "" (const TextIO.putStr) +stdioTarget :: Maybe FilePath -> Target +stdioTarget filename = Target TextIO.getContents (fromMaybe "" filename) (const TextIO.putStr) fileTarget :: FilePath -> Target fileTarget path = Target (readFileUtf8 path) path atomicWriteFile @@ -153,8 +160,8 @@ checkFileTarget :: FilePath -> Target checkFileTarget path = Target (readFileUtf8 path) path (const $ const $ pure ()) toTargets :: Nixfmt -> IO [Target] -toTargets Nixfmt{files = []} = pure [stdioTarget] -toTargets Nixfmt{files = ["-"]} = pure [stdioTarget] +toTargets Nixfmt{files = [], filename} = pure [stdioTarget filename] +toTargets Nixfmt{files = ["-"], filename} = pure [stdioTarget filename] toTargets Nixfmt{check = False, files = paths} = map fileTarget <$> collectAllNixFiles paths toTargets Nixfmt{check = True, files = paths} = map checkFileTarget <$> collectAllNixFiles paths diff --git a/src/Nixfmt/Types.hs b/src/Nixfmt/Types.hs index 93dd1d0..43d9073 100644 --- a/src/Nixfmt/Types.hs +++ b/src/Nixfmt/Types.hs @@ -48,6 +48,7 @@ import Control.Monad.State.Strict (StateT) import Data.Bifunctor (first) import Data.Foldable (toList) import Data.Function (on) +import Data.Int (Int64) import Data.List.NonEmpty as NonEmpty import Data.Maybe (maybeToList) import Data.Text (Text, pack) @@ -487,7 +488,7 @@ instance (LanguageElement a) => LanguageElement (NonEmpty a) where mapAllTokens f = NonEmpty.map (mapAllTokens f) data Token - = Integer Int + = Integer Int64 | Float Text | Identifier Text | EnvPath Text