#pragma once ///@file #include #include "types.hh" namespace nix { /** * A parsed Store URI (URI is a slight misnomer...), parsed but not yet * resolved to a specific instance and query parms validated. * * Supported values are: * * - `local`: The Nix store in /nix/store and database in * /nix/var/nix/db, accessed directly. * * - `daemon`: The Nix store accessed via a Unix domain socket * connection to nix-daemon. * * - `unix://`: The Nix store accessed via a Unix domain socket * connection to nix-daemon, with the socket located at ``. * * - `auto` or ``: Equivalent to `local` or `daemon` depending on * whether the user has write access to the local Nix * store/database. * * - `file://`: A binary cache stored in ``. * * - `https://`: A binary cache accessed via HTTP. * * - `s3://`: A writable binary cache stored on Amazon's Simple * Storage Service. * * - `ssh://[user@]`: A remote Nix store accessed by running * `nix-store --serve` via SSH. * * You can pass parameters to the store type by appending * `?key=value&key=value&...` to the URI. */ struct StoreReference { using Params = std::map; /** * Special store reference `""` or `"auto"` */ struct Auto { inline bool operator==(const Auto & rhs) const = default; inline auto operator<=>(const Auto & rhs) const = default; }; /** * General case, a regular `scheme://authority` URL. */ struct Specified { std::string scheme; std::string authority = ""; bool operator==(const Specified & rhs) const = default; auto operator<=>(const Specified & rhs) const = default; }; typedef std::variant Variant; Variant variant; Params params; bool operator==(const StoreReference & rhs) const = default; /** * Render the whole store reference as a URI, including parameters. */ std::string render() const; /** * Parse a URI into a store reference. */ static StoreReference parse(const std::string & uri, const Params & extraParams = Params{}); }; /** * Split URI into protocol+hierarchy part and its parameter set. */ std::pair splitUriAndParams(const std::string & uri); }