IdeaLingua

IdeaLingua is an RPC framework & Domain Modeling Language, it’s purpose is to:

  • Share & publish APIs and data models in a common concise format
  • Allow remote calls to services given their public API definitions.
  • Create idiomatic API clients and servers for all programming languages – currently Scala, TypeScript, C# & Go.
  • Support frontend-to-backend and backend-to-frontend calls (ala push notifications, via buzzer definitions)
  • Abstract away details such as the network protocol or the serialization format.
  • Save developers from untyped and brittle REST.

User Service Example

package user.api

enum Gender = Male | Female

id EntityID {
  uuid: uuid
}

mixin Entity {
  id: EntityID
}

mixin Person {
  name: str
  surname: str
  gender: Gender
}

data User {
  & Entity
  + Person
  password: str
}

data PublicUser {
  + User
  - password: str
}

adt Result = Success | Failure

data Success {
  message: str
}

data Failure {
  code: int8
}

service UserService {
  def saveUser(user: User): Result
  def findUserByName(name: str): list[PublicUser] | Failure
}

Quick start

You may use our preconfigured Docker environment to experiment with Izumi IDL compiler:

docker run -ti --rm septimalmind/izumi-env

Then try this snippet:

export COMPILER="io.7mind.izumi:idealingua-v1-compiler_2.12:$izumi.version$"
export S_REPOSITORY=https://oss.sonatype.org/content/repositories/snapshots
export R_REPOSITORY=https://oss.sonatype.org/content/repositories/releases

# create sample project in `testproject` directory
cs launch -r $S_REPOSITORY -r $R_REPOSITORY $COMPILER -- :init testproject

cd testproject

# compile Scala and Typescript projects using all the defaults
cs launch -r $S_REPOSITORY -r $R_REPOSITORY $COMPILER -- :scala :typescript

# Run SBT on generated Scala project
pushd .
cd target/scala
sbt package
popd

# Run tsc on generated Typescript project
pushd .
cd target/typescript
yarn install
tsc
popd

apt install -y mc
mc

Example Project

See idealingua-example for examples for Scala, TypeScript, Go, C# and other languages.

Installation

Using SBT Plugin

Add the following to your project/plugins.sbt file:

val izumi_version = "1.2.17-SNAPSHOT"
addSbtPlugin("io.7mind.izumi" % "sbt-idealingua" % izumi_version)

Place your domain definitions into /src/main/izumi directory, then enable the plugin for that project. For the generated code to compile, you will also need to add dependencies on the Idealingua RTS modules:

val izumi = prop

izumiProject
  .enablePlugins(IdealinguaPlugin)
  .settings(
    libraryDependencies ++= Seq(
        Izumi.R.idealingua_model
      , Izumi.R.idealingua_runtime_rpc
      , Izumi.R.idealingua_runtime_rpc_http4s
      , Izumi.R.idealingua_runtime_rpc_circe
    )
  )

You can depend on the code generated by Idealinguain in your other Scala projects:

project.dependsOn(izumiProject)

Using the standalone compiler

The compiler is built as an uberjar and published to Maven Central.

The preferred way to install the compiler is via coursier

To install current release version:

# install release executable
cs bootstrap izumi.r2:idealingua-compiler_2.12:1.2.17-SNAPSHOT -o idlc

./idlc --help

To install development snapshot:

# install snapshot
cs bootstrap -r https://oss.sonatype.org/content/repositories/snapshots/ izumi.r2:idealingua-compiler_2.12:0.7.0-SNAPSHOT -o idlc

./idlc --help

Commandline examples:

# compile sources in ./src and output generated code to ./target/scala and ./target/typescript
# all compiler plugins for Scala and TypeScript are enabled by * pattern

./idlc -s src -t target -L scala=* -L typescript=*
# compile with `AnyValExtension` compiler plugin for Scala disabled

./idlc -s src -t target -L scala=-AnyvalExtension -L typescript=*

Scala http4s Transport

Most likely you’ll need to use Kind Projector and enable partial unification:

addCompilerPlugin("org.typelevel" % "kind-projector" % "0.11.0" cross CrossVersion.full)

// Only for Scala 2.12, not required on 2.13+
scalacOptions += "-Ypartial-unification"

You may find the test suite for the http4s backend here.