IOApp для Scala-cat в контексте OSGi - PullRequest
0 голосов
/ 01 марта 2019

Приложение, которое я сейчас разрабатываю, написано в стиле функционального программирования с использованием scala-cats ' IOApp .

Теперь проблема в том, что мне нужно развернутьэто приложение в контексте OSGi, которое на самом деле не соответствует моему функциональному подходу.

Мой основной метод выглядит следующим образом:

object Main extends IOApp {
  override def run(args: List[String]): IO[ExitCode] = for {
    _ <- IO(println("Starting with args: " + args.mkString(",")))
    myProgram = new MyProgram(/*...*/)
    _ <- myProgram.run() // def run(): IO[RunResult]
    // ...
    _ <- myProgram.exit() // def exit(): IO[Unit]
    } yield ExitCode.Success
}

Теперь, чтобы развернуть его в OSGi, мне пришлось написать BundleActivator :

import org.osgi.framework.{BundleActivator, BundleContext}

class Activator extends BundleActivator {

  private var myProgram: Option[myProgram] = None

  override def start(context: BundleContext): Unit = {
    myProgram = Some(new MyProgram(/*...*/))
    myProgram.foreach{ _.run().unsafeRunSync() }
  }

  override def stop(context: BundleContext): Unit = {
    myProgram.foreach{ _.exit().unsafeRunSync() }
  }
}

Как вы можете видеть, это Activator, который я придумал, далек от написания функциональным образом.Можно ли как-нибудь избавиться от var myProgram (изменяемый var, если быть точным)?Кажется, я не могу понять, как это возможно.

Редактировать: Активатор должен быть определен в манифесте, так что это часть моего build.sbt:

packageOptions := Seq(ManifestAttributes(
  ("Bundle-Activator", "my.package.Activator"),
  ...)) 
...