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

ants.detective.platform_2.13.0.1.0.source-code.Platform.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2022 Anton Sviridov
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.indoorvivants.detective

object Platform {
  sealed abstract class OS(val string: String)
      extends Product
      with Serializable {
    import OS._
    def coursierString: String = this match {
      case Windows => "pc-win32"
      case MacOS   => "apple-darwin"
      case Linux   => "pc-linux"
      case Unknown => "unknown"
    }
  }
  object OS {
    case object Windows extends OS("windows")
    case object MacOS extends OS("osx")
    case object Linux extends OS("linux")
    case object Unknown extends OS("unknown")

    val all = List(Windows, MacOS, Linux, Unknown)
    def detect(osNameProp: String): OS = normalise(osNameProp) match {
      case p if p.startsWith("linux")                         => OS.Linux
      case p if p.startsWith("windows")                       => OS.Windows
      case p if p.startsWith("osx") || p.startsWith("macosx") => OS.MacOS
      case _                                                  => OS.Unknown
    }
    def fromProps(props: Map[String, String]): OS =
      detect(props.getOrElse("os.name", ""))
  }

  sealed abstract class Arch extends Product with Serializable
  object Arch {
    case object Intel extends Arch {}
    case object Arm extends Arch {}

    val all = List(Intel, Arm)
    def detect(osArchProp: String): Arch = normalise(osArchProp) match {
      case "amd64" | "x64" | "x8664" | "x86" => Intel
      case "aarch64" | "arm64"               => Arm
    }

    def fromProps(props: Map[String, String]): Arch =
      detect(props.getOrElse("os.arch", ""))
  }

  sealed abstract class Bits extends Product with Serializable
  object Bits {
    case object x32 extends Bits
    case object x64 extends Bits

    def detect(sunArchProp: String) =
      sunArchProp match {
        case "64" => x64
        case "32" => x32
      }

    def fromProps(props: Map[String, String]): Bits =
      detect(props.getOrElse("sun.arch.data.model", "64"))
  }

  case class Target(os: OS, arch: Arch, bits: Bits)

  private lazy val propsMap = sys.props.toMap

  lazy val os = OS.fromProps(propsMap)
  lazy val arch = Arch.fromProps(propsMap)
  lazy val bits = Bits.fromProps(propsMap)
  lazy val target = Target(os, arch, bits)

  private def normalise(s: String) =
    s.toLowerCase.replaceAll("[^a-z0-9]+", "")
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy