Skip to main content

mix.exs

defmodule Sidereon.MixProject do
  use Mix.Project

  alias Sidereon.Format.OMM
  alias Sidereon.Format.TLE
  alias Sidereon.GNSS.Broadcast
  alias Sidereon.GNSS.CarrierPhase
  alias Sidereon.GNSS.Constellation
  alias Sidereon.GNSS.DGNSS
  alias Sidereon.GNSS.Frequencies
  alias Sidereon.GNSS.Geometry
  alias Sidereon.GNSS.Ionosphere
  alias Sidereon.GNSS.IonosphereFree
  alias Sidereon.GNSS.Navigation.LNAV
  alias Sidereon.GNSS.Navigation.LNAV.Ephemeris
  alias Sidereon.GNSS.Observables
  alias Sidereon.GNSS.Positioning
  alias Sidereon.GNSS.PrecisePositioning
  alias Sidereon.GNSS.QC
  alias Sidereon.GNSS.ReducedOrbit
  alias Sidereon.GNSS.RINEX.Observations
  alias Sidereon.GNSS.RTK
  alias Sidereon.GNSS.Signal.CA
  alias Sidereon.GNSS.Signal.Correlator
  alias Sidereon.GNSS.SP3
  alias Sidereon.GNSS.Troposphere
  alias Sidereon.GNSS.Velocity

  @version "0.9.1"
  @source_url "https://github.com/neilberkman/sidereon-ex"

  def project do
    [
      app: :sidereon,
      version: @version,
      elixir: "~> 1.18",
      elixirc_paths: elixirc_paths(Mix.env()),
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      name: "Sidereon",
      description: description(),
      package: package(),
      docs: docs(),
      source_url: @source_url,
      test_ignore_filters: [&String.starts_with?(&1, "test/fixtures/")]
    ]
  end

  def application do
    [
      mod: {Sidereon.Application, []},
      extra_applications: [:logger]
    ]
  end

  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_env), do: ["lib"]

  defp deps do
    [
      {:rustler, "~> 0.37", optional: true},
      {:rustler_precompiled, "~> 0.9"},
      {:jason, "~> 1.4"},
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false},
      {:ex_doc, "~> 0.34", only: :dev, runtime: false},
      {:quokka, "~> 2.13", only: [:dev, :test], runtime: false}
    ]
  end

  defp description do
    """
    Satellite toolkit for Elixir with SGP4 propagation, coordinate transforms,
    GNSS positioning, orbit determination, conjunction assessment, pass
    prediction, and a Rust NIF backend.
    """
  end

  defp package do
    [
      files: package_files(),
      licenses: ["MIT"],
      links: %{"GitHub" => @source_url}
    ]
  end

  defp package_files do
    [
      "lib",
      "native/sidereon_nif/src",
      "native/sidereon_nif/Cargo*",
      "mix.exs",
      "README.md",
      "CHANGELOG.md",
      "LICENSE"
    ] ++ Path.wildcard("checksum-*.exs")
  end

  defp docs do
    [
      main: "Sidereon",
      skip_undefined_reference_warnings_on: ["CHANGELOG.md"],
      extras: [
        "README.md",
        "CHANGELOG.md",
        "guides/pass_prediction.md",
        "guides/accuracy.md",
        "guides/gnss_constellation_catalog.md",
        "examples/gnss_positioning.livemd"
      ],
      groups_for_extras: [
        Guides: Path.wildcard("guides/*.md")
      ],
      groups_for_modules: [
        Core: [Sidereon, Sidereon.Elements, Sidereon.SGP4, Sidereon.TemeState],
        Coordinates: [Sidereon.Coordinates],
        "Ground Station": [Sidereon.Passes, Sidereon.Doppler, Sidereon.RF],
        "Orbit Determination": [Sidereon.IOD, Sidereon.Lambert],
        "Space Environment": [
          Sidereon.Eclipse,
          Sidereon.Atmosphere,
          Sidereon.Ephemeris,
          Sidereon.Angles
        ],
        Conjunction: [Sidereon.Conjunction],
        "GNSS Positioning": [
          Positioning,
          PrecisePositioning,
          SP3,
          Broadcast,
          Observations,
          ReducedOrbit,
          Constellation,
          Geometry,
          Observables,
          Velocity,
          QC,
          DGNSS,
          RTK,
          Frequencies,
          CarrierPhase,
          IonosphereFree,
          Ionosphere,
          Troposphere,
          Sidereon.GNSS.Time,
          CA,
          Correlator,
          LNAV,
          Ephemeris
        ],
        "Data Sources": [Sidereon.Constellation],
        "Batch Analysis": [Sidereon.Coverage, Sidereon.RF],
        Format: [TLE, OMM]
      ]
    ]
  end
end