simple-triplestore 0.1.1

A simple graph database for storing triples with support for custom node and edge properties.
Documentation
{
  description = "creates a dev container for triplestore";

  inputs = {
    flake-utils.url = "github:numtide/flake-utils"; # Utility functions for Nix flakes
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # Main Nix package repository
    rust-overlay.url = "github:oxalica/rust-overlay?rev=260ff391290a2b23958d04db0d3e7015c8417401";
      rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
      rust-overlay.inputs.flake-utils.follows = "flake-utils";
  };

  outputs = { self, flake-utils, nixpkgs, rust-overlay, ... }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [ rust-overlay.overlays.default];
        };
        # This is needed since VSCode Devcontainers need the following files in order to function.
        baseInfo = with pkgs; [
          # Set up shadow file with user information
          (writeTextDir "etc/shadow" ''
            root:!x:::::::
          '')
          # Set up passwd file with user information
          (writeTextDir "etc/passwd" ''
            root:x:0:0::/root:${runtimeShell}
          '')
          # Set up group file with user information
          (writeTextDir "etc/group" ''
            root:x:0:
          '')
          # Set up gshadow file with user information
          (writeTextDir "etc/gshadow" ''
            root:x::
          '')
          # Set up os-release file with NixOS information, since it is nix the check requirements
          # step for the dev container creation will skip.
          (writeTextDir "etc/os-release" ''
            NAME="NixOS"
            ID=nixos
            VERSION="unstable"
            VERSION_CODENAME=unstable
            PRETTY_NAME="NixOS (unstable)"
            HOME_URL="https://nixos.org/"
            SUPPORT_URL="https://nixos.org/nixos/manual/"
            BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
          '')
        ];

        myEnv = pkgs.buildEnv {
          name = "my-env";
          paths = with pkgs; [
            # -- Basic Required Files --
            bash # Basic bash to run bare essnetial code
            coreutils-full # Essential GNU utilities (ls, cat, etc.)

            # -- Needed for VSCode dev container --
            gnutar # GNU version of tar for archiving 
            gzip # Compression utility
            gnugrep # GNU version of grep for searching text
            gnused # GNU version of sed for text processing
            pkgs.stdenv.cc.cc.lib # Standard C library needed for linking C++ programs

            # -- OpenSSL --
            cacert
            openssl
            openssl.dev

            # -- Development tools --
            code-server
            which
            curl
            lsof
            strace
            ripgrep
            tree
            tree-sitter
            nix
            git
            fzf
            fd
            eza
            deterministic-uname
            findutils
            gnugrep
            getent
            gawk
            ps

            # -- Compilers, Etc. --
            gcc
            grc
            cmake
            gnumake
            libclang
            python3

            # -- Rust --
            (lib.meta.hiPrio rust-bin.nightly.latest.default)
            rustup
            pkg-config
          ];
          pathsToLink = [
            "/bin"
            "/etc/ssl/certs"
          ];
        };

      in
      {
        packages.default = pkgs.dockerTools.buildImage {
          name = "triplestore-dev";
          tag = "latest";
          copyToRoot = [ myEnv ] ++ baseInfo; 
          config = {
            WorkingDir = "/workspace";
            Env = [
              # Add certificates to allow for cargo to download files
              "SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt"
              "SSL_CERT_DIR=/etc/ssl/certs"
              "CARGO_HTTP_CAINFO=/etc/ssl/certs/ca-bundle.crt"
              "CC=gcc" # Set GCC as the default C compiler
              "CXX=g++" # Set G++ as the default C++ compiler
              # Library path for dynamic linking
              "LD_LIBRARY_PATH=${pkgs.stdenv.cc.cc.lib}/lib"
              # Add openssl to pkg config to ensure that it loads for cargo build
              "PKG_CONFIG_PATH=${pkgs.openssl.dev}/lib/pkgconfig"
              # Setting PATH to include essential binaries
              "PATH=/bin:/usr/bin:${myEnv}/bin:/root/.cargo/bin"
              "USER=root" # Setting user to root
              "COREUTILS=${pkgs.coreutils-full}"
              "CMAKE=/bin/cmake"
              "CMAKE_MAKE_PROGRAM=/bin/make"
              "LIBCLANG_PATH=${pkgs.libclang.lib}/lib/"
            ];
            Volumes = { };
            Cmd = [ "/bin/bash" ];
          };
          extraCommands = ''
            # Link the env binary (needed for the check requirements script)
            mkdir -p usr/bin/
            ln -n bin/env usr/bin/env 

            # Link the dynamic linker/loader (needed for Node within vscode server)
            mkdir -p lib64 
            ln -s ${pkgs.glibc}/lib/ld-linux-x86-64.so.2 lib64/ld-linux-x86-64.so.2 

            # Create /tmp dir
            mkdir -p tmp
          '';
        };
      }
    );
}