git.iko.soy/rowtype-yoga/purescript-yoga-pino-om
on main help sign in
Initial: yoga-pino-om
commit3b6ec8de71edaa383a990386e6487d7c3e19714d authorMark <mark.eibes@gmail.com> dateWed 4 Feb 2026, 21:57 (8 months ago)
6 files changed+127
.github/workflows/ci.yml+9 .gitignore+3 package.json+12 spago.yaml+19 src/Yoga/LoggerOm.purs+46 src/Yoga/PinoOm.purs+38
.github/workflows/ci.ymlnew file+9
@@ -0,0 +1,9 @@
1+name: CI
2+on: [push, pull_request]
3+jobs:
4+ build:
5+ runs-on: ubuntu-latest
6+ steps:
7+ - uses: actions/checkout@v4
8+ - uses: rowtype-yoga/purescript-yoga-actions/.github/actions/setup@main
9+ - run: spago build
.gitignorenew file+3
@@ -0,0 +1,3 @@
1+node_modules/
2+.spago/
3+output*/
package.jsonnew file+12
@@ -0,0 +1,12 @@
1+{
2+ "name": "purescript-yoga-pino-om",
3+ "version": "0.1.0",
4+ "description": "Om-wrapped Pino logger operations",
5+ "license": "MIT",
6+ "repository": {
7+ "type": "git",
8+ "url": "https://github.com/rowtype-yoga/purescript-yoga-backend-stack.git",
9+ "directory": "packages/yoga-pino-om"
10+ },
11+ "keywords": ["purescript", "ffi", "bindings", "yoga"]
12+}
spago.yamlnew file+19
@@ -0,0 +1,19 @@
1+workspace:
2+ package_set:
3+ registry: 51.1.0
4+
5+package:
6+ name: yoga-pino-om
7+ publish:
8+ version: 0.1.0
9+ license: MIT
10+ location:
11+ githubOwner: rowtype-yoga
12+ githubRepo: purescript-yoga-pino-om
13+ dependencies:
14+ - yoga-pino: "*"
15+ - yoga-om-core: ">=1.0.0 <2.0.0"
16+ - yoga-om-layer: ">=1.0.0 <2.0.0"
17+ - aff: ">=7.0.0 <8.0.0"
18+ - effect: ">=4.0.0 <5.0.0"
19+ - prelude: ">=6.0.0 <7.0.0"
src/Yoga/LoggerOm.pursnew file+46
@@ -0,0 +1,46 @@
1+module Yoga.LoggerOm
2+ ( logInfo
3+ , logDebug
4+ , logWarn
5+ , logError
6+ ) where
7+
8+import Prelude
9+
10+import Effect.Class (liftEffect)
11+import Yoga.Logger (Logger)
12+import Yoga.Logger as Logger
13+import Prim.Row (class Lacks)
14+import Record as Record
15+import Type.Proxy (Proxy(..))
16+import Unsafe.Coerce (unsafeCoerce)
17+import Yoga.Om as Om
18+
19+-- Helper to convert record to Object String
20+recordToObjectString :: forall r. Record r -> Logger.LogContext
21+recordToObjectString = unsafeCoerce
22+
23+-- Om-specific logging functions that use the unified Logger interface
24+logInfo :: forall ctx logCtx err. Lacks "body" logCtx => String -> { | logCtx } -> Om.Om { logger :: Logger | ctx } err Unit
25+logInfo message logCtx = do
26+ { logger } <- Om.ask
27+ let ctxWithBody = Record.insert (Proxy :: Proxy "body") message logCtx
28+ liftEffect $ Logger.logInfo logger message (recordToObjectString ctxWithBody)
29+
30+logDebug :: forall ctx logCtx err. Lacks "body" logCtx => String -> { | logCtx } -> Om.Om { logger :: Logger | ctx } err Unit
31+logDebug message logCtx = do
32+ { logger } <- Om.ask
33+ let ctxWithBody = Record.insert (Proxy :: Proxy "body") message logCtx
34+ liftEffect $ Logger.logDebug logger message (recordToObjectString ctxWithBody)
35+
36+logWarn :: forall ctx logCtx err. Lacks "body" logCtx => String -> { | logCtx } -> Om.Om { logger :: Logger | ctx } err Unit
37+logWarn message logCtx = do
38+ { logger } <- Om.ask
39+ let ctxWithBody = Record.insert (Proxy :: Proxy "body") message logCtx
40+ liftEffect $ Logger.logWarn logger message (recordToObjectString ctxWithBody)
41+
42+logError :: forall ctx logCtx err. Lacks "body" logCtx => String -> { | logCtx } -> Om.Om { logger :: Logger | ctx } err Unit
43+logError message logCtx = do
44+ { logger } <- Om.ask
45+ let ctxWithBody = Record.insert (Proxy :: Proxy "body") message logCtx
46+ liftEffect $ Logger.logError logger message (recordToObjectString ctxWithBody)
src/Yoga/PinoOm.pursnew file+38
@@ -0,0 +1,38 @@
1+module Yoga.PinoOm
2+ ( logInfo
3+ , logDebug
4+ , logWarn
5+ , logError
6+ ) where
7+
8+import Prelude
9+
10+import Effect.Class (liftEffect)
11+import Yoga.Pino as Log
12+import Prim.Row (class Lacks)
13+import Record as Record
14+import Type.Proxy (Proxy(..))
15+import Yoga.Om as Om
16+
17+-- All logging functions automatically get logger from Om context!
18+-- New API: message + context object (msg gets merged in automatically)
19+
20+logInfo :: forall ctx r err. Lacks "msg" ctx => String -> { | ctx } -> Om.Om { logger :: Log.Logger | r } err Unit
21+logInfo msg context = do
22+ { logger } <- Om.ask
23+ liftEffect $ Log.infoWith logger (Record.insert (Proxy :: _ "msg") msg context)
24+
25+logDebug :: forall ctx r err. Lacks "msg" ctx => String -> { | ctx } -> Om.Om { logger :: Log.Logger | r } err Unit
26+logDebug msg context = do
27+ { logger } <- Om.ask
28+ liftEffect $ Log.debugWith logger (Record.insert (Proxy :: _ "msg") msg context)
29+
30+logWarn :: forall ctx r err. Lacks "msg" ctx => String -> { | ctx } -> Om.Om { logger :: Log.Logger | r } err Unit
31+logWarn msg context = do
32+ { logger } <- Om.ask
33+ liftEffect $ Log.warnWith logger (Record.insert (Proxy :: _ "msg") msg context)
34+
35+logError :: forall ctx r err. Lacks "msg" ctx => String -> { | ctx } -> Om.Om { logger :: Log.Logger | r } err Unit
36+logError msg context = do
37+ { logger } <- Om.ask
38+ liftEffect $ Log.errorWith logger (Record.insert (Proxy :: _ "msg") msg context)