Haskell project
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
build/
|
||||
.env
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
.stack-root
|
||||
.pi/
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
{- | Entry point for the Roux recipe server.
|
||||
Starts a Warp HTTP server and serves recipe content.
|
||||
-}
|
||||
module Main (main) where
|
||||
|
||||
import Data.String (fromString)
|
||||
import qualified Network.Wai.Handler.Warp as Warp
|
||||
import qualified Options.Applicative as Opts
|
||||
|
||||
import qualified Roux
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- CLI options
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
data Options = Options
|
||||
{ optHost :: String
|
||||
, optPort :: Int
|
||||
, optRecipeDir :: FilePath
|
||||
}
|
||||
|
||||
optionsParser :: Opts.Parser Options
|
||||
optionsParser =
|
||||
Options
|
||||
<$> Opts.strOption
|
||||
( Opts.long "host"
|
||||
<> Opts.metavar "HOST"
|
||||
<> Opts.help "Listen host"
|
||||
<> Opts.value "0.0.0.0"
|
||||
<> Opts.showDefault
|
||||
)
|
||||
<*> Opts.option
|
||||
Opts.auto
|
||||
( Opts.long "port"
|
||||
<> Opts.short 'p'
|
||||
<> Opts.metavar "PORT"
|
||||
<> Opts.help "Listen port"
|
||||
<> Opts.value 8080
|
||||
<> Opts.showDefault
|
||||
)
|
||||
<*> Opts.strOption
|
||||
( Opts.long "recipe-dir"
|
||||
<> Opts.short 'r'
|
||||
<> Opts.metavar "DIR"
|
||||
<> Opts.help "Path to directory containing Cooklang recipe files"
|
||||
<> Opts.value "recipes"
|
||||
<> Opts.showDefault
|
||||
)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
opts <-
|
||||
Opts.execParser $
|
||||
Opts.info
|
||||
(optionsParser Opts.<**> Opts.helper)
|
||||
( Opts.fullDesc
|
||||
<> Opts.progDesc "Roux recipe management server"
|
||||
<> Opts.header "roux-server — personal/family recipe manager"
|
||||
)
|
||||
let settings =
|
||||
Warp.setPort (optPort opts) $
|
||||
Warp.setHost
|
||||
(fromString (optHost opts))
|
||||
Warp.defaultSettings
|
||||
|
||||
putStrLn $ "[roux] scanning recipes from " <> optRecipeDir opts
|
||||
putStrLn $ "[roux] listening on " <> optHost opts <> ":" <> show (optPort opts)
|
||||
|
||||
waiApp <- Roux.app (optRecipeDir opts)
|
||||
Warp.runSettings settings waiApp
|
||||
@@ -0,0 +1,63 @@
|
||||
name: roux-server
|
||||
version: 0.1.0
|
||||
synopsis: Personal/family recipe management site
|
||||
description: A low-friction recipe manager using Cooklang files,
|
||||
with cook history tracking and search.
|
||||
author: James Brechtel
|
||||
maintainer: james@flipstone.com
|
||||
copyright: 2026 James Brechtel
|
||||
license: BSD-3-Clause
|
||||
|
||||
default-extensions:
|
||||
- OverloadedStrings
|
||||
|
||||
ghc-options:
|
||||
- -Wall
|
||||
- -Werror
|
||||
- -Wcompat
|
||||
- -Widentities
|
||||
- -Wincomplete-record-updates
|
||||
- -Wincomplete-uni-patterns
|
||||
- -Wmissing-export-lists
|
||||
- -Wmissing-home-modules
|
||||
- -Wpartial-fields
|
||||
- -Wredundant-constraints
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- blaze-html
|
||||
- blaze-markup
|
||||
- bytestring
|
||||
- directory
|
||||
- http-types
|
||||
- optparse-applicative
|
||||
- parsec
|
||||
- text
|
||||
- time
|
||||
- wai
|
||||
- warp
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
||||
executables:
|
||||
roux-server:
|
||||
main: Main.hs
|
||||
source-dirs: app
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- optparse-applicative
|
||||
- roux-server
|
||||
- unix
|
||||
|
||||
tests:
|
||||
roux-server-test:
|
||||
main: Spec.hs
|
||||
source-dirs: test
|
||||
dependencies:
|
||||
- roux-server
|
||||
- tasty
|
||||
- tasty-hunit
|
||||
@@ -0,0 +1,101 @@
|
||||
cabal-version: 2.2
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.38.1.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: roux-server
|
||||
version: 0.1.0
|
||||
synopsis: Personal/family recipe management site
|
||||
description: A low-friction recipe manager using Cooklang files, with cook history tracking and search.
|
||||
author: James Brechtel
|
||||
maintainer: james@flipstone.com
|
||||
copyright: 2026 James Brechtel
|
||||
license: BSD-3-Clause
|
||||
build-type: Simple
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Roux
|
||||
Roux.Types
|
||||
other-modules:
|
||||
Paths_roux_server
|
||||
autogen-modules:
|
||||
Paths_roux_server
|
||||
hs-source-dirs:
|
||||
src
|
||||
default-extensions:
|
||||
OverloadedStrings
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, blaze-html
|
||||
, blaze-markup
|
||||
, bytestring
|
||||
, directory
|
||||
, http-types
|
||||
, optparse-applicative
|
||||
, parsec
|
||||
, text
|
||||
, time
|
||||
, wai
|
||||
, warp
|
||||
default-language: Haskell2010
|
||||
|
||||
executable roux-server
|
||||
main-is: Main.hs
|
||||
other-modules:
|
||||
Paths_roux_server
|
||||
autogen-modules:
|
||||
Paths_roux_server
|
||||
hs-source-dirs:
|
||||
app
|
||||
default-extensions:
|
||||
OverloadedStrings
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, blaze-html
|
||||
, blaze-markup
|
||||
, bytestring
|
||||
, directory
|
||||
, http-types
|
||||
, optparse-applicative
|
||||
, parsec
|
||||
, roux-server
|
||||
, text
|
||||
, time
|
||||
, unix
|
||||
, wai
|
||||
, warp
|
||||
default-language: Haskell2010
|
||||
|
||||
test-suite roux-server-test
|
||||
type: exitcode-stdio-1.0
|
||||
main-is: Spec.hs
|
||||
other-modules:
|
||||
Paths_roux_server
|
||||
autogen-modules:
|
||||
Paths_roux_server
|
||||
hs-source-dirs:
|
||||
test
|
||||
default-extensions:
|
||||
OverloadedStrings
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, blaze-html
|
||||
, blaze-markup
|
||||
, bytestring
|
||||
, directory
|
||||
, http-types
|
||||
, optparse-applicative
|
||||
, parsec
|
||||
, roux-server
|
||||
, tasty
|
||||
, tasty-hunit
|
||||
, text
|
||||
, time
|
||||
, wai
|
||||
, warp
|
||||
default-language: Haskell2010
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{- | Top-level re-exports and application setup for Roux.
|
||||
-}
|
||||
module Roux
|
||||
( app
|
||||
, module X
|
||||
) where
|
||||
|
||||
import qualified Network.HTTP.Types as HTTP
|
||||
import qualified Network.Wai as Wai
|
||||
|
||||
import Roux.Types as X
|
||||
|
||||
-- | Build the WAI 'Application' given a path to the recipe directory.
|
||||
app :: FilePath -> IO Wai.Application
|
||||
app _recipeDir =
|
||||
pure $ \_request respond ->
|
||||
respond $
|
||||
Wai.responseLBS
|
||||
HTTP.status200
|
||||
[("Content-Type", "text/plain")]
|
||||
"Hello from Roux!"
|
||||
@@ -0,0 +1,9 @@
|
||||
{- | Core types for Roux.
|
||||
-}
|
||||
module Roux.Types
|
||||
( -- * Types
|
||||
RecipeDir (..)
|
||||
) where
|
||||
|
||||
-- | Path to the directory containing Cooklang recipe files.
|
||||
newtype RecipeDir = RecipeDir FilePath
|
||||
@@ -0,0 +1,4 @@
|
||||
resolver: lts-24.38
|
||||
|
||||
packages:
|
||||
- .
|
||||
@@ -0,0 +1,12 @@
|
||||
# This file was autogenerated by Stack.
|
||||
# You should not edit this file by hand.
|
||||
# For more information, please see the documentation at:
|
||||
# https://docs.haskellstack.org/en/stable/topics/lock_files
|
||||
|
||||
packages: []
|
||||
snapshots:
|
||||
- completed:
|
||||
sha256: abc790b571e0c70e929db74b329e3c18d7e76a6e173e8bdf94f1ba20770d4c24
|
||||
size: 728990
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/24/38.yaml
|
||||
original: lts-24.38
|
||||
@@ -0,0 +1,10 @@
|
||||
module Main (main) where
|
||||
|
||||
import Test.Tasty (defaultMain, testGroup)
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
defaultMain $
|
||||
testGroup
|
||||
"roux-server"
|
||||
[ ]
|
||||
Reference in New Issue
Block a user