All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mchange.unifyrss.server.scala Maven / Gradle / Ivy

The newest version!
package com.mchange.unifyrss

import zio.*
import zio.http.Server
import java.net.URL
import audiofluidity.rss.Element
import scala.xml.{Elem,XML}
import unstatic.UrlPath.*
import sttp.tapir.ztapir.*
import sttp.tapir.server.interceptor.log.DefaultServerLog
import sttp.tapir.server.ziohttp.{ZioHttpInterpreter,ZioHttpServerOptions}

val VerboseServerInterpreterOptions: ZioHttpServerOptions[Any] =
// modified from https://github.com/longliveenduro/zio-geolocation-tapir-tapir-starter/blob/b79c88b9b1c44a60d7c547d04ca22f12f420d21d/src/main/scala/com/tsystems/toil/Main.scala
  ZioHttpServerOptions
    .customiseInterceptors
    .serverLog(
      DefaultServerLog[Task](
        doLogWhenReceived = msg => ZIO.succeed(println(msg)),
        doLogWhenHandled = (msg, error) => ZIO.succeed(error.fold(println(msg))(err => println(s"msg: ${msg}, err: ${err}"))),
        doLogAllDecodeFailures = (msg, error) => ZIO.succeed(error.fold(println(msg))(err => println(s"msg: ${msg}, err: ${err}"))),
        doLogExceptions = (msg: String, exc: Throwable) => ZIO.succeed(println(s"msg: ${msg}, exc: ${exc}")),
        noLog = ZIO.unit
      )
    )
    .options

val DefaltServerInterpreterOptions: ZioHttpServerOptions[Any] = ZioHttpServerOptions.default.widen[Any]

def interpreterOptions(verbose: Boolean) = if verbose then VerboseServerInterpreterOptions else DefaltServerInterpreterOptions

def feedServerLogic(feedPath: Rel, mergedFeedRefs: FeedRefMap): Unit => UIO[Array[Byte]] =
  (_: Unit) => mergedFeedRefs(feedPath).get.map(_.toArray)

def feedZServerEndpoint(feedPath: Rel, fem: FeedEndpointMap, mergedFeedRefs: FeedRefMap) =
  val endpoint = fem(feedPath)
  val logic = feedServerLogic(feedPath, mergedFeedRefs)
  endpoint.zServerLogic[Any](logic)

def allServerEndpoints(dc: DaemonConfig, fem: FeedEndpointMap, mergedFeedRefs: FeedRefMap) =
  dc.mergedFeeds.map(mf => feedZServerEndpoint(mf.feedPath, fem, mergedFeedRefs)).toList

def toHttpApp(dc: DaemonConfig, zServerEndpoints: List[ZServerEndpoint[Any, Any]]) =
  ZioHttpInterpreter(interpreterOptions(dc.verbose)).toHttp(zServerEndpoints)

def server(dc: DaemonConfig, mergedFeedRefs: FeedRefMap) : Task[Nothing] =
  val fem = feedEndpoints( dc )
  val zServerEndpoints = allServerEndpoints(dc, fem, mergedFeedRefs)
  val httpApp = toHttpApp(dc, zServerEndpoints)
  Server
    .serve(httpApp)
    .provide(ZLayer.succeed(Server.Config.default.port(dc.servicePort)), Server.live)








© 2015 - 2025 Weber Informatics LLC | Privacy Policy