Repository: stac-utils/stac-rs (language: python)

Issue:
Put all the crates in a folder
There's a lot of top-level folders, time to reduce.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e330cd9d..cc4aa95f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -42,7 +42,7 @@ jobs:
     runs-on: ubuntu-latest
     defaults:
       run:
-        working-directory: cli
+        working-directory: crates/cli
     steps:
       - uses: actions/checkout@v4
       - uses: Swatinem/rust-cache@v2
diff --git a/Cargo.toml b/Cargo.toml
index 9a78ba39..2a9eb435 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,16 +1,21 @@
 [workspace]
 resolver = "2"
 members = [
-    "api",
-    "cli",
-    "core",
-    "duckdb",
-    "extensions",
-    "pgstac",
+    "crates/api",
+    "crates/cli",
+    "crates/core",
+    "crates/duckdb",
+    "crates/extensions",
+    "crates/pgstac",
     "python",
-    "server",
+    "crates/server",
+]
+default-members = [
+    "crates/api",
+    "crates/cli",
+    "crates/core",
+    "crates/extensions",
 ]
-default-members = ["api", "cli", "core", "extensions"]
 
 [workspace.package]
 authors = ["Pete Gadomski <pete.gadomski@gmail.com>"]
@@ -51,7 +56,7 @@ mime = "0.3.17"
 mockito = "1.5"
 object_store = "0.11.0"
 parquet = { version = "52.2", default-features = false }
-pgstac = { version = "0.2.1", path = "pgstac" }
+pgstac = { version = "0.2.1", path = "crates/pgstac" }
 pyo3 = "0.22.3"
 pythonize = "0.22.0"
 quote = "1.0"
@@ -61,10 +66,10 @@ rustls = { version = "0.23.14", default-features = false }
 serde = "1.0"
 serde_json = "1.0"
 serde_urlencoded = "0.7.1"
-stac = { version = "0.10.2", path = "core" }
-stac-api = { version = "0.6.0", path = "api" }
-stac-duckdb = { version = "0.0.2", path = "duckdb" }
-stac-server = { version = "0.3.1", path = "server" }
+stac = { version = "0.10.2", path = "crates/core" }
+stac-api = { version = "0.6.0", path = "crates/api" }
+stac-duckdb = { version = "0.0.2", path = "crates/duckdb" }
+stac-server = { version = "0.3.1", path = "crates/server" }
 syn = "2.0"
 tempfile = "3.13"
 thiserror = "1.0"
diff --git a/README.md b/README.md
index 1efffa3d..f9429f47 100644
--- a/README.md
+++ b/README.md
@@ -8,24 +8,25 @@
 
 Command Line Interface (CLI), Rust crates, and other libraries for the [SpatioTemporal Asset Catalog (STAC)](https://stacspec.org/) specification.
 
-- [stac-cli](./cli/README.md) is a command-line interface to query a STAC API, create and validate STAC items, and do other awesome stuff on the command line.
-- [stac](./core/README.md) is the core library with data structures (`Item`, `Catalog`, and `Collection`) and more.
-- [stac-api](./api/README.md) contains the data structures for the [STAC API specification](https://github.com/radiantearth/stac-api-spec) and a client for interacting with one.
-- [stac-server](./server/README.md) is a STAC API server with multiple backends.
-- [stacrs](./python/README.md) is a small, no-dependency Python library based on **stac-rs**.
+- [stac-cli](./crates/cli/README.md) is a command-line interface to query a STAC API, create and validate STAC items, and do other awesome stuff on the command line.
+- [stac](./crates/core/README.md) is the core library with data structures (`Item`, `Catalog`, and `Collection`) and more.
+- [stac-api](./crates/api/README.md) contains the data structures for the [STAC API specification](https://github.com/radiantearth/stac-api-spec) and a client for interacting with one.
+- [stac-server](./crates/server/README.md) is a STAC API server with multiple backends.
+- [stacrs](./crates/python/README.md) is a small, no-dependency Python library based on **stac-rs**.
 
 ## Crates
 
 This monorepo contains several crates:
 
-| Crate                             | Description                                                                                     | Badges                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
-| --------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [stac](./core/README.md)          | Core data structures and I/O                                                                    | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/core.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/core.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/stac?style=flat-square)](https://docs.rs/stac/latest/stac/) <br> [![Crates.io](https://img.shields.io/crates/v/stac?style=flat-square)](https://crates.io/crates/stac)                                        |
-| [stac-api](./api/README.md)       | Data structures for the [STAC API](https://github.com/radiantearth/stac-api-spec) specification | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/api.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/api.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/stac-api?style=flat-square)](https://docs.rs/stac-api/latest/stac_api/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-api?style=flat-square)](https://crates.io/crates/stac-api)                      |
-| [stac-cli](./cli/README.md)       | Command line interface                                                                          | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/cli.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/cli.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/stac-cli?style=flat-square)](https://docs.rs/stac-cli/latest/stac_cli/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-cli?style=flat-square)](https://crates.io/crates/stac-cli)                      |
-| [stac-server](./server/README.md) | STAC API server with multiple backends                                                          | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/server.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/server.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/stac-server?style=flat-square)](https://docs.rs/stac-server/latest/stac_server/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-server?style=flat-square)](https://crates.io/crates/stac-server) |
-| [pgstac](./pgstac/README.md)      | Bindings for [pgstac](https://github.com/stac-utils/pgstac)                                     | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/pgstac.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/pgstac.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/pgstac?style=flat-square)](https://docs.rs/pgstac/latest/pgstac/) <br> [![Crates.io](https://img.shields.io/crates/v/pgstac?style=flat-square)](https://crates.io/crates/pgstac)                          |
-| [stac-duckdb](./duckdb/README.md) | Experimental client for [duckdb](https://duckdb.org/)                                           | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/duckdb.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/duckdb.yml) <br /> [![docs.rs](https://img.shields.io/docsrs/stac-duckdb?style=flat-square)](https://docs.rs/stac-duckdb/latest/stac_duckdb/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-duckdb?style=flat-square)](https://crates.io/crates/stac-duckdb) |
+| Crate                                            | Description                                                                                     | Badges                                                                                                                                                                                                                                                                  |
+| ------------------------------------------------ | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [stac](./crates/core/README.md)                  | Core data structures and I/O                                                                    | [![docs.rs](https://img.shields.io/docsrs/stac?style=flat-square)](https://docs.rs/stac/latest/stac/) <br> [![Crates.io](https://img.shields.io/crates/v/stac?style=flat-square)](https://crates.io/crates/stac)                                                        |
+| [stac-api](./crates/api/README.md)               | Data structures for the [STAC API](https://github.com/radiantearth/stac-api-spec) specification | [![docs.rs](https://img.shields.io/docsrs/stac-api?style=flat-square)](https://docs.rs/stac-api/latest/stac_api/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-api?style=flat-square)](https://crates.io/crates/stac-api)                                    |
+| [stac-extensions](./crates/extensions/README.md) | Basic support for [STAC extensions](https://stac-extensions.github.io/)                         | [![docs.rs](https://img.shields.io/docsrs/stac-extensions?style=flat-square)](https://docs.rs/stac-extensions/latest/stac_extensions/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-extensions?style=flat-square)](https://crates.io/crates/stac-extensions) |
+| [stac-cli](./crates/cli/README.md)               | Command line interface                                                                          | [![docs.rs](https://img.shields.io/docsrs/stac-cli?style=flat-square)](https://docs.rs/stac-cli/latest/stac_cli/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-cli?style=flat-square)](https://crates.io/crates/stac-cli)                                    |
+| [stac-server](./crates/server/README.md)         | STAC API server with multiple backends                                                          | [![docs.rs](https://img.shields.io/docsrs/stac-server?style=flat-square)](https://docs.rs/stac-server/latest/stac_server/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-server?style=flat-square)](https://crates.io/crates/stac-server)                     |
+| [pgstac](./crates/pgstac/README.md)              | Bindings for [pgstac](https://github.com/stac-utils/pgstac)                                     | [![docs.rs](https://img.shields.io/docsrs/pgstac?style=flat-square)](https://docs.rs/pgstac/latest/pgstac/) <br> [![Crates.io](https://img.shields.io/crates/v/pgstac?style=flat-square)](https://crates.io/crates/pgstac)                                              |
+| [stac-duckdb](./crates/duckdb/README.md)         | Experimental client for [duckdb](https://duckdb.org/)                                           | [![docs.rs](https://img.shields.io/docsrs/stac-duckdb?style=flat-square)](https://docs.rs/stac-duckdb/latest/stac_duckdb/) <br> [![Crates.io](https://img.shields.io/crates/v/stac-duckdb?style=flat-square)](https://crates.io/crates/stac-duckdb)                     |
 
 ## Bindings
 
diff --git a/cli/examples b/cli/examples
deleted file mode 120000
index dc8ca857..00000000
--- a/cli/examples
+++ /dev/null
@@ -1,1 +0,0 @@
-../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/core/examples b/core/examples
deleted file mode 120000
index dc8ca857..00000000
--- a/core/examples
+++ /dev/null
@@ -1,1 +0,0 @@
-../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/api/CHANGELOG.md b/crates/api/CHANGELOG.md
similarity index 100%
rename from api/CHANGELOG.md
rename to crates/api/CHANGELOG.md
diff --git a/api/Cargo.toml b/crates/api/Cargo.toml
similarity index 100%
rename from api/Cargo.toml
rename to crates/api/Cargo.toml
diff --git a/api/README.md b/crates/api/README.md
similarity index 100%
rename from api/README.md
rename to crates/api/README.md
diff --git a/api/mocks/items-page-1.json b/crates/api/mocks/items-page-1.json
similarity index 100%
rename from api/mocks/items-page-1.json
rename to crates/api/mocks/items-page-1.json
diff --git a/api/mocks/items-page-2.json b/crates/api/mocks/items-page-2.json
similarity index 100%
rename from api/mocks/items-page-2.json
rename to crates/api/mocks/items-page-2.json
diff --git a/api/mocks/not-a-collection.json b/crates/api/mocks/not-a-collection.json
similarity index 100%
rename from api/mocks/not-a-collection.json
rename to crates/api/mocks/not-a-collection.json
diff --git a/api/mocks/search-page-1.json b/crates/api/mocks/search-page-1.json
similarity index 100%
rename from api/mocks/search-page-1.json
rename to crates/api/mocks/search-page-1.json
diff --git a/api/mocks/search-page-2.json b/crates/api/mocks/search-page-2.json
similarity index 100%
rename from api/mocks/search-page-2.json
rename to crates/api/mocks/search-page-2.json
diff --git a/api/src/client.rs b/crates/api/src/client.rs
similarity index 100%
rename from api/src/client.rs
rename to crates/api/src/client.rs
diff --git a/api/src/collections.rs b/crates/api/src/collections.rs
similarity index 100%
rename from api/src/collections.rs
rename to crates/api/src/collections.rs
diff --git a/api/src/conformance.rs b/crates/api/src/conformance.rs
similarity index 100%
rename from api/src/conformance.rs
rename to crates/api/src/conformance.rs
diff --git a/api/src/error.rs b/crates/api/src/error.rs
similarity index 100%
rename from api/src/error.rs
rename to crates/api/src/error.rs
diff --git a/api/src/fields.rs b/crates/api/src/fields.rs
similarity index 100%
rename from api/src/fields.rs
rename to crates/api/src/fields.rs
diff --git a/api/src/filter.rs b/crates/api/src/filter.rs
similarity index 100%
rename from api/src/filter.rs
rename to crates/api/src/filter.rs
diff --git a/api/src/item_collection.rs b/crates/api/src/item_collection.rs
similarity index 100%
rename from api/src/item_collection.rs
rename to crates/api/src/item_collection.rs
diff --git a/api/src/items.rs b/crates/api/src/items.rs
similarity index 100%
rename from api/src/items.rs
rename to crates/api/src/items.rs
diff --git a/api/src/lib.rs b/crates/api/src/lib.rs
similarity index 100%
rename from api/src/lib.rs
rename to crates/api/src/lib.rs
diff --git a/api/src/root.rs b/crates/api/src/root.rs
similarity index 100%
rename from api/src/root.rs
rename to crates/api/src/root.rs
diff --git a/api/src/search.rs b/crates/api/src/search.rs
similarity index 100%
rename from api/src/search.rs
rename to crates/api/src/search.rs
diff --git a/api/src/sort.rs b/crates/api/src/sort.rs
similarity index 100%
rename from api/src/sort.rs
rename to crates/api/src/sort.rs
diff --git a/api/src/url_builder.rs b/crates/api/src/url_builder.rs
similarity index 100%
rename from api/src/url_builder.rs
rename to crates/api/src/url_builder.rs
diff --git a/cli/CHANGELOG.md b/crates/cli/CHANGELOG.md
similarity index 100%
rename from cli/CHANGELOG.md
rename to crates/cli/CHANGELOG.md
diff --git a/cli/Cargo.toml b/crates/cli/Cargo.toml
similarity index 100%
rename from cli/Cargo.toml
rename to crates/cli/Cargo.toml
diff --git a/cli/README.md b/crates/cli/README.md
similarity index 100%
rename from cli/README.md
rename to crates/cli/README.md
diff --git a/crates/cli/examples b/crates/cli/examples
new file mode 120000
index 00000000..2419d7c4
--- /dev/null
+++ b/crates/cli/examples
@@ -0,0 +1,1 @@
+../../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/cli/pyproject.toml b/crates/cli/pyproject.toml
similarity index 100%
rename from cli/pyproject.toml
rename to crates/cli/pyproject.toml
diff --git a/cli/src/args/item.rs b/crates/cli/src/args/item.rs
similarity index 100%
rename from cli/src/args/item.rs
rename to crates/cli/src/args/item.rs
diff --git a/cli/src/args/items.rs b/crates/cli/src/args/items.rs
similarity index 100%
rename from cli/src/args/items.rs
rename to crates/cli/src/args/items.rs
diff --git a/cli/src/args/migrate.rs b/crates/cli/src/args/migrate.rs
similarity index 100%
rename from cli/src/args/migrate.rs
rename to crates/cli/src/args/migrate.rs
diff --git a/cli/src/args/mod.rs b/crates/cli/src/args/mod.rs
similarity index 100%
rename from cli/src/args/mod.rs
rename to crates/cli/src/args/mod.rs
diff --git a/cli/src/args/search.rs b/crates/cli/src/args/search.rs
similarity index 100%
rename from cli/src/args/search.rs
rename to crates/cli/src/args/search.rs
diff --git a/cli/src/args/serve.rs b/crates/cli/src/args/serve.rs
similarity index 100%
rename from cli/src/args/serve.rs
rename to crates/cli/src/args/serve.rs
diff --git a/cli/src/args/translate.rs b/crates/cli/src/args/translate.rs
similarity index 100%
rename from cli/src/args/translate.rs
rename to crates/cli/src/args/translate.rs
diff --git a/cli/src/args/validate.rs b/crates/cli/src/args/validate.rs
similarity index 100%
rename from cli/src/args/validate.rs
rename to crates/cli/src/args/validate.rs
diff --git a/cli/src/error.rs b/crates/cli/src/error.rs
similarity index 100%
rename from cli/src/error.rs
rename to crates/cli/src/error.rs
diff --git a/cli/src/input.rs b/crates/cli/src/input.rs
similarity index 100%
rename from cli/src/input.rs
rename to crates/cli/src/input.rs
diff --git a/cli/src/lib.rs b/crates/cli/src/lib.rs
similarity index 100%
rename from cli/src/lib.rs
rename to crates/cli/src/lib.rs
diff --git a/cli/src/main.rs b/crates/cli/src/main.rs
similarity index 100%
rename from cli/src/main.rs
rename to crates/cli/src/main.rs
diff --git a/cli/src/options.rs b/crates/cli/src/options.rs
similarity index 100%
rename from cli/src/options.rs
rename to crates/cli/src/options.rs
diff --git a/cli/src/output.rs b/crates/cli/src/output.rs
similarity index 100%
rename from cli/src/output.rs
rename to crates/cli/src/output.rs
diff --git a/cli/src/python.rs b/crates/cli/src/python.rs
similarity index 100%
rename from cli/src/python.rs
rename to crates/cli/src/python.rs
diff --git a/cli/src/value.rs b/crates/cli/src/value.rs
similarity index 100%
rename from cli/src/value.rs
rename to crates/cli/src/value.rs
diff --git a/core/CHANGELOG.md b/crates/core/CHANGELOG.md
similarity index 100%
rename from core/CHANGELOG.md
rename to crates/core/CHANGELOG.md
diff --git a/core/Cargo.toml b/crates/core/Cargo.toml
similarity index 100%
rename from core/Cargo.toml
rename to crates/core/Cargo.toml
diff --git a/core/README.md b/crates/core/README.md
similarity index 100%
rename from core/README.md
rename to crates/core/README.md
diff --git a/core/assets/dataset.tif b/crates/core/assets/dataset.tif
similarity index 100%
rename from core/assets/dataset.tif
rename to crates/core/assets/dataset.tif
diff --git a/core/assets/dataset_geo.tif b/crates/core/assets/dataset_geo.tif
similarity index 100%
rename from core/assets/dataset_geo.tif
rename to crates/core/assets/dataset_geo.tif
diff --git a/core/data/20201211_223832_CS2.json b/crates/core/data/20201211_223832_CS2.json
similarity index 100%
rename from core/data/20201211_223832_CS2.json
rename to crates/core/data/20201211_223832_CS2.json
diff --git a/core/data/bands-v1.0.0.json b/crates/core/data/bands-v1.0.0.json
similarity index 100%
rename from core/data/bands-v1.0.0.json
rename to crates/core/data/bands-v1.0.0.json
diff --git a/core/data/bands-v1.1.0.json b/crates/core/data/bands-v1.1.0.json
similarity index 100%
rename from core/data/bands-v1.1.0.json
rename to crates/core/data/bands-v1.1.0.json
diff --git a/core/data/extended-item.parquet b/crates/core/data/extended-item.parquet
similarity index 100%
rename from core/data/extended-item.parquet
rename to crates/core/data/extended-item.parquet
diff --git a/core/data/item-collection.json b/crates/core/data/item-collection.json
similarity index 100%
rename from core/data/item-collection.json
rename to crates/core/data/item-collection.json
diff --git a/core/data/items.ndjson b/crates/core/data/items.ndjson
similarity index 100%
rename from core/data/items.ndjson
rename to crates/core/data/items.ndjson
diff --git a/core/data/two-sentinel-2-items.json b/crates/core/data/two-sentinel-2-items.json
similarity index 100%
rename from core/data/two-sentinel-2-items.json
rename to crates/core/data/two-sentinel-2-items.json
diff --git a/crates/core/examples b/crates/core/examples
new file mode 120000
index 00000000..2419d7c4
--- /dev/null
+++ b/crates/core/examples
@@ -0,0 +1,1 @@
+../../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/core/src/asset.rs b/crates/core/src/asset.rs
similarity index 100%
rename from core/src/asset.rs
rename to crates/core/src/asset.rs
diff --git a/core/src/band.rs b/crates/core/src/band.rs
similarity index 100%
rename from core/src/band.rs
rename to crates/core/src/band.rs
diff --git a/core/src/bbox.rs b/crates/core/src/bbox.rs
similarity index 100%
rename from core/src/bbox.rs
rename to crates/core/src/bbox.rs
diff --git a/core/src/catalog.rs b/crates/core/src/catalog.rs
similarity index 100%
rename from core/src/catalog.rs
rename to crates/core/src/catalog.rs
diff --git a/core/src/collection.rs b/crates/core/src/collection.rs
similarity index 100%
rename from core/src/collection.rs
rename to crates/core/src/collection.rs
diff --git a/core/src/data_type.rs b/crates/core/src/data_type.rs
similarity index 100%
rename from core/src/data_type.rs
rename to crates/core/src/data_type.rs
diff --git a/core/src/datetime.rs b/crates/core/src/datetime.rs
similarity index 100%
rename from core/src/datetime.rs
rename to crates/core/src/datetime.rs
diff --git a/core/src/error.rs b/crates/core/src/error.rs
similarity index 100%
rename from core/src/error.rs
rename to crates/core/src/error.rs
diff --git a/core/src/fields.rs b/crates/core/src/fields.rs
similarity index 100%
rename from core/src/fields.rs
rename to crates/core/src/fields.rs
diff --git a/core/src/format.rs b/crates/core/src/format.rs
similarity index 100%
rename from core/src/format.rs
rename to crates/core/src/format.rs
diff --git a/core/src/geo.rs b/crates/core/src/geo.rs
similarity index 100%
rename from core/src/geo.rs
rename to crates/core/src/geo.rs
diff --git a/core/src/geoarrow/json.rs b/crates/core/src/geoarrow/json.rs
similarity index 100%
rename from core/src/geoarrow/json.rs
rename to crates/core/src/geoarrow/json.rs
diff --git a/core/src/geoarrow/mod.rs b/crates/core/src/geoarrow/mod.rs
similarity index 100%
rename from core/src/geoarrow/mod.rs
rename to crates/core/src/geoarrow/mod.rs
diff --git a/core/src/geoparquet/feature.rs b/crates/core/src/geoparquet/feature.rs
similarity index 100%
rename from core/src/geoparquet/feature.rs
rename to crates/core/src/geoparquet/feature.rs
diff --git a/core/src/geoparquet/mod.rs b/crates/core/src/geoparquet/mod.rs
similarity index 100%
rename from core/src/geoparquet/mod.rs
rename to crates/core/src/geoparquet/mod.rs
diff --git a/core/src/geoparquet/no_feature.rs b/crates/core/src/geoparquet/no_feature.rs
similarity index 100%
rename from core/src/geoparquet/no_feature.rs
rename to crates/core/src/geoparquet/no_feature.rs
diff --git a/core/src/href.rs b/crates/core/src/href.rs
similarity index 100%
rename from core/src/href.rs
rename to crates/core/src/href.rs
diff --git a/core/src/io.rs b/crates/core/src/io.rs
similarity index 100%
rename from core/src/io.rs
rename to crates/core/src/io.rs
diff --git a/core/src/item.rs b/crates/core/src/item.rs
similarity index 100%
rename from core/src/item.rs
rename to crates/core/src/item.rs
diff --git a/core/src/item_asset.rs b/crates/core/src/item_asset.rs
similarity index 100%
rename from core/src/item_asset.rs
rename to crates/core/src/item_asset.rs
diff --git a/core/src/item_collection.rs b/crates/core/src/item_collection.rs
similarity index 100%
rename from core/src/item_collection.rs
rename to crates/core/src/item_collection.rs
diff --git a/core/src/json.rs b/crates/core/src/json.rs
similarity index 100%
rename from core/src/json.rs
rename to crates/core/src/json.rs
diff --git a/core/src/lib.rs b/crates/core/src/lib.rs
similarity index 100%
rename from core/src/lib.rs
rename to crates/core/src/lib.rs
diff --git a/core/src/link.rs b/crates/core/src/link.rs
similarity index 100%
rename from core/src/link.rs
rename to crates/core/src/link.rs
diff --git a/core/src/migrate.rs b/crates/core/src/migrate.rs
similarity index 98%
rename from core/src/migrate.rs
rename to crates/core/src/migrate.rs
index 0fc0f1a9..febbbb66 100644
--- a/core/src/migrate.rs
+++ b/crates/core/src/migrate.rs
@@ -12,7 +12,7 @@ pub trait Migrate: Sized + Serialize + DeserializeOwned + std::fmt::Debug {
     /// ```
     /// use stac::{Item, Migrate, Version};
     ///
-    /// let mut item: Item = stac::read("../spec-examples/v1.0.0/simple-item.json").unwrap();
+    /// let mut item: Item = stac::read("../../spec-examples/v1.0.0/simple-item.json").unwrap();
     /// let item = item.migrate(&Version::v1_1_0).unwrap();
     /// assert_eq!(item.version, Version::v1_1_0);
     /// ```
@@ -266,7 +266,7 @@ mod tests {
 
     #[test]
     fn migrate_v1_1_0_to_v1_1_0() {
-        let item: Item = crate::read("../spec-examples/v1.1.0/simple-item.json").unwrap();
+        let item: Item = crate::read("../../spec-examples/v1.1.0/simple-item.json").unwrap();
         let _ = item.migrate(&Version::v1_1_0).unwrap();
     }
 }
diff --git a/core/src/mime.rs b/crates/core/src/mime.rs
similarity index 100%
rename from core/src/mime.rs
rename to crates/core/src/mime.rs
diff --git a/core/src/ndjson.rs b/crates/core/src/ndjson.rs
similarity index 100%
rename from core/src/ndjson.rs
rename to crates/core/src/ndjson.rs
diff --git a/core/src/statistics.rs b/crates/core/src/statistics.rs
similarity index 100%
rename from core/src/statistics.rs
rename to crates/core/src/statistics.rs
diff --git a/core/src/validate/blocking.rs b/crates/core/src/validate/blocking.rs
similarity index 100%
rename from core/src/validate/blocking.rs
rename to crates/core/src/validate/blocking.rs
diff --git a/core/src/validate/mod.rs b/crates/core/src/validate/mod.rs
similarity index 100%
rename from core/src/validate/mod.rs
rename to crates/core/src/validate/mod.rs
diff --git a/core/src/validate/schemas/geojson/Feature.json b/crates/core/src/validate/schemas/geojson/Feature.json
similarity index 100%
rename from core/src/validate/schemas/geojson/Feature.json
rename to crates/core/src/validate/schemas/geojson/Feature.json
diff --git a/core/src/validate/schemas/geojson/Geometry.json b/crates/core/src/validate/schemas/geojson/Geometry.json
similarity index 100%
rename from core/src/validate/schemas/geojson/Geometry.json
rename to crates/core/src/validate/schemas/geojson/Geometry.json
diff --git a/core/src/validate/schemas/json-schema/draft-07.json b/crates/core/src/validate/schemas/json-schema/draft-07.json
similarity index 100%
rename from core/src/validate/schemas/json-schema/draft-07.json
rename to crates/core/src/validate/schemas/json-schema/draft-07.json
diff --git a/core/src/validate/schemas/v1.0.0/basics.json b/crates/core/src/validate/schemas/v1.0.0/basics.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/basics.json
rename to crates/core/src/validate/schemas/v1.0.0/basics.json
diff --git a/core/src/validate/schemas/v1.0.0/catalog.json b/crates/core/src/validate/schemas/v1.0.0/catalog.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/catalog.json
rename to crates/core/src/validate/schemas/v1.0.0/catalog.json
diff --git a/core/src/validate/schemas/v1.0.0/collection.json b/crates/core/src/validate/schemas/v1.0.0/collection.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/collection.json
rename to crates/core/src/validate/schemas/v1.0.0/collection.json
diff --git a/core/src/validate/schemas/v1.0.0/datetime.json b/crates/core/src/validate/schemas/v1.0.0/datetime.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/datetime.json
rename to crates/core/src/validate/schemas/v1.0.0/datetime.json
diff --git a/core/src/validate/schemas/v1.0.0/instrument.json b/crates/core/src/validate/schemas/v1.0.0/instrument.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/instrument.json
rename to crates/core/src/validate/schemas/v1.0.0/instrument.json
diff --git a/core/src/validate/schemas/v1.0.0/item.json b/crates/core/src/validate/schemas/v1.0.0/item.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/item.json
rename to crates/core/src/validate/schemas/v1.0.0/item.json
diff --git a/core/src/validate/schemas/v1.0.0/licensing.json b/crates/core/src/validate/schemas/v1.0.0/licensing.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/licensing.json
rename to crates/core/src/validate/schemas/v1.0.0/licensing.json
diff --git a/core/src/validate/schemas/v1.0.0/provider.json b/crates/core/src/validate/schemas/v1.0.0/provider.json
similarity index 100%
rename from core/src/validate/schemas/v1.0.0/provider.json
rename to crates/core/src/validate/schemas/v1.0.0/provider.json
diff --git a/core/src/validate/schemas/v1.1.0/bands.json b/crates/core/src/validate/schemas/v1.1.0/bands.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/bands.json
rename to crates/core/src/validate/schemas/v1.1.0/bands.json
diff --git a/core/src/validate/schemas/v1.1.0/basics.json b/crates/core/src/validate/schemas/v1.1.0/basics.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/basics.json
rename to crates/core/src/validate/schemas/v1.1.0/basics.json
diff --git a/core/src/validate/schemas/v1.1.0/catalog.json b/crates/core/src/validate/schemas/v1.1.0/catalog.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/catalog.json
rename to crates/core/src/validate/schemas/v1.1.0/catalog.json
diff --git a/core/src/validate/schemas/v1.1.0/collection.json b/crates/core/src/validate/schemas/v1.1.0/collection.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/collection.json
rename to crates/core/src/validate/schemas/v1.1.0/collection.json
diff --git a/core/src/validate/schemas/v1.1.0/common.json b/crates/core/src/validate/schemas/v1.1.0/common.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/common.json
rename to crates/core/src/validate/schemas/v1.1.0/common.json
diff --git a/core/src/validate/schemas/v1.1.0/data-values.json b/crates/core/src/validate/schemas/v1.1.0/data-values.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/data-values.json
rename to crates/core/src/validate/schemas/v1.1.0/data-values.json
diff --git a/core/src/validate/schemas/v1.1.0/datetime.json b/crates/core/src/validate/schemas/v1.1.0/datetime.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/datetime.json
rename to crates/core/src/validate/schemas/v1.1.0/datetime.json
diff --git a/core/src/validate/schemas/v1.1.0/instrument.json b/crates/core/src/validate/schemas/v1.1.0/instrument.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/instrument.json
rename to crates/core/src/validate/schemas/v1.1.0/instrument.json
diff --git a/core/src/validate/schemas/v1.1.0/item.json b/crates/core/src/validate/schemas/v1.1.0/item.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/item.json
rename to crates/core/src/validate/schemas/v1.1.0/item.json
diff --git a/core/src/validate/schemas/v1.1.0/licensing.json b/crates/core/src/validate/schemas/v1.1.0/licensing.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/licensing.json
rename to crates/core/src/validate/schemas/v1.1.0/licensing.json
diff --git a/core/src/validate/schemas/v1.1.0/provider.json b/crates/core/src/validate/schemas/v1.1.0/provider.json
similarity index 100%
rename from core/src/validate/schemas/v1.1.0/provider.json
rename to crates/core/src/validate/schemas/v1.1.0/provider.json
diff --git a/core/src/validate/validator.rs b/crates/core/src/validate/validator.rs
similarity index 100%
rename from core/src/validate/validator.rs
rename to crates/core/src/validate/validator.rs
diff --git a/core/src/value.rs b/crates/core/src/value.rs
similarity index 100%
rename from core/src/value.rs
rename to crates/core/src/value.rs
diff --git a/core/src/version.rs b/crates/core/src/version.rs
similarity index 100%
rename from core/src/version.rs
rename to crates/core/src/version.rs
diff --git a/duckdb/CHANGELOG.md b/crates/duckdb/CHANGELOG.md
similarity index 100%
rename from duckdb/CHANGELOG.md
rename to crates/duckdb/CHANGELOG.md
diff --git a/duckdb/Cargo.toml b/crates/duckdb/Cargo.toml
similarity index 100%
rename from duckdb/Cargo.toml
rename to crates/duckdb/Cargo.toml
diff --git a/duckdb/README.md b/crates/duckdb/README.md
similarity index 100%
rename from duckdb/README.md
rename to crates/duckdb/README.md
diff --git a/duckdb/data/100-landsat-items.parquet b/crates/duckdb/data/100-landsat-items.parquet
similarity index 100%
rename from duckdb/data/100-landsat-items.parquet
rename to crates/duckdb/data/100-landsat-items.parquet
diff --git a/duckdb/data/100-sentinel-2-items.parquet b/crates/duckdb/data/100-sentinel-2-items.parquet
similarity index 100%
rename from duckdb/data/100-sentinel-2-items.parquet
rename to crates/duckdb/data/100-sentinel-2-items.parquet
diff --git a/duckdb/src/lib.rs b/crates/duckdb/src/lib.rs
similarity index 100%
rename from duckdb/src/lib.rs
rename to crates/duckdb/src/lib.rs
diff --git a/extensions/Cargo.toml b/crates/extensions/Cargo.toml
similarity index 100%
rename from extensions/Cargo.toml
rename to crates/extensions/Cargo.toml
diff --git a/extensions/data/auth/collection.json b/crates/extensions/data/auth/collection.json
similarity index 100%
rename from extensions/data/auth/collection.json
rename to crates/extensions/data/auth/collection.json
diff --git a/extensions/data/auth/item.json b/crates/extensions/data/auth/item.json
similarity index 100%
rename from extensions/data/auth/item.json
rename to crates/extensions/data/auth/item.json
diff --git a/extensions/data/eo/item.json b/crates/extensions/data/eo/item.json
similarity index 100%
rename from extensions/data/eo/item.json
rename to crates/extensions/data/eo/item.json
diff --git a/crates/extensions/examples b/crates/extensions/examples
new file mode 120000
index 00000000..2419d7c4
--- /dev/null
+++ b/crates/extensions/examples
@@ -0,0 +1,1 @@
+../../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/extensions/src/authentication.rs b/crates/extensions/src/authentication.rs
similarity index 100%
rename from extensions/src/authentication.rs
rename to crates/extensions/src/authentication.rs
diff --git a/extensions/src/electro_optical.rs b/crates/extensions/src/electro_optical.rs
similarity index 100%
rename from extensions/src/electro_optical.rs
rename to crates/extensions/src/electro_optical.rs
diff --git a/extensions/src/lib.rs b/crates/extensions/src/lib.rs
similarity index 100%
rename from extensions/src/lib.rs
rename to crates/extensions/src/lib.rs
diff --git a/extensions/src/projection.rs b/crates/extensions/src/projection.rs
similarity index 100%
rename from extensions/src/projection.rs
rename to crates/extensions/src/projection.rs
diff --git a/extensions/src/raster.rs b/crates/extensions/src/raster.rs
similarity index 100%
rename from extensions/src/raster.rs
rename to crates/extensions/src/raster.rs
diff --git a/pgstac/CHANGELOG.md b/crates/pgstac/CHANGELOG.md
similarity index 100%
rename from pgstac/CHANGELOG.md
rename to crates/pgstac/CHANGELOG.md
diff --git a/pgstac/Cargo.toml b/crates/pgstac/Cargo.toml
similarity index 100%
rename from pgstac/Cargo.toml
rename to crates/pgstac/Cargo.toml
diff --git a/pgstac/README.md b/crates/pgstac/README.md
similarity index 100%
rename from pgstac/README.md
rename to crates/pgstac/README.md
diff --git a/pgstac/docker-compose.yml b/crates/pgstac/docker-compose.yml
similarity index 100%
rename from pgstac/docker-compose.yml
rename to crates/pgstac/docker-compose.yml
diff --git a/pgstac/src/client.rs b/crates/pgstac/src/client.rs
similarity index 100%
rename from pgstac/src/client.rs
rename to crates/pgstac/src/client.rs
diff --git a/pgstac/src/lib.rs b/crates/pgstac/src/lib.rs
similarity index 100%
rename from pgstac/src/lib.rs
rename to crates/pgstac/src/lib.rs
diff --git a/pgstac/src/page.rs b/crates/pgstac/src/page.rs
similarity index 100%
rename from pgstac/src/page.rs
rename to crates/pgstac/src/page.rs
diff --git a/pgstac/src/tls.rs b/crates/pgstac/src/tls.rs
similarity index 100%
rename from pgstac/src/tls.rs
rename to crates/pgstac/src/tls.rs
diff --git a/server/CHANGELOG.md b/crates/server/CHANGELOG.md
similarity index 100%
rename from server/CHANGELOG.md
rename to crates/server/CHANGELOG.md
diff --git a/server/Cargo.toml b/crates/server/Cargo.toml
similarity index 100%
rename from server/Cargo.toml
rename to crates/server/Cargo.toml
diff --git a/server/README.md b/crates/server/README.md
similarity index 100%
rename from server/README.md
rename to crates/server/README.md
diff --git a/server/data/joplin/collection.json b/crates/server/data/joplin/collection.json
similarity index 100%
rename from server/data/joplin/collection.json
rename to crates/server/data/joplin/collection.json
diff --git a/server/data/joplin/feature.geojson b/crates/server/data/joplin/feature.geojson
similarity index 100%
rename from server/data/joplin/feature.geojson
rename to crates/server/data/joplin/feature.geojson
diff --git a/server/data/sentinel-2/collection.json b/crates/server/data/sentinel-2/collection.json
similarity index 100%
rename from server/data/sentinel-2/collection.json
rename to crates/server/data/sentinel-2/collection.json
diff --git a/server/data/sentinel-2/item-collection.json b/crates/server/data/sentinel-2/item-collection.json
similarity index 100%
rename from server/data/sentinel-2/item-collection.json
rename to crates/server/data/sentinel-2/item-collection.json
diff --git a/server/src/api.rs b/crates/server/src/api.rs
similarity index 100%
rename from server/src/api.rs
rename to crates/server/src/api.rs
diff --git a/server/src/backend/memory.rs b/crates/server/src/backend/memory.rs
similarity index 100%
rename from server/src/backend/memory.rs
rename to crates/server/src/backend/memory.rs
diff --git a/server/src/backend/mod.rs b/crates/server/src/backend/mod.rs
similarity index 100%
rename from server/src/backend/mod.rs
rename to crates/server/src/backend/mod.rs
diff --git a/server/src/backend/pgstac.rs b/crates/server/src/backend/pgstac.rs
similarity index 100%
rename from server/src/backend/pgstac.rs
rename to crates/server/src/backend/pgstac.rs
diff --git a/server/src/error.rs b/crates/server/src/error.rs
similarity index 100%
rename from server/src/error.rs
rename to crates/server/src/error.rs
diff --git a/server/src/lib.rs b/crates/server/src/lib.rs
similarity index 100%
rename from server/src/lib.rs
rename to crates/server/src/lib.rs
diff --git a/server/src/openapi.yaml b/crates/server/src/openapi.yaml
similarity index 100%
rename from server/src/openapi.yaml
rename to crates/server/src/openapi.yaml
diff --git a/server/src/redoc.html b/crates/server/src/redoc.html
similarity index 100%
rename from server/src/redoc.html
rename to crates/server/src/redoc.html
diff --git a/server/src/routes.rs b/crates/server/src/routes.rs
similarity index 100%
rename from server/src/routes.rs
rename to crates/server/src/routes.rs
diff --git a/extensions/examples b/extensions/examples
deleted file mode 120000
index dc8ca857..00000000
--- a/extensions/examples
+++ /dev/null
@@ -1,1 +0,0 @@
-../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/scripts/validate-stac-server b/scripts/validate-stac-server
index 7cc78440..70c5a725 100755
--- a/scripts/validate-stac-server
+++ b/scripts/validate-stac-server
@@ -8,7 +8,7 @@
 
 set -e
 
-args="server/data/sentinel-2/*"
+args="crates/server/data/sentinel-2/*"
 build_args="--no-default-features"
 
 if [ $# -eq 1 ]; then


Test patch:
diff --git a/cli/tests/data/collection-bad-temporal.json b/crates/cli/tests/data/collection-bad-temporal.json
similarity index 100%
rename from cli/tests/data/collection-bad-temporal.json
rename to crates/cli/tests/data/collection-bad-temporal.json
diff --git a/cli/tests/smoke.rs b/crates/cli/tests/smoke.rs
similarity index 96%
rename from cli/tests/smoke.rs
rename to crates/cli/tests/smoke.rs
index 28392246..9ab2ca70 100644
--- a/cli/tests/smoke.rs
+++ b/crates/cli/tests/smoke.rs
@@ -31,7 +31,7 @@ fn migrate() {
     let mut command = Command::cargo_bin("stacrs").unwrap();
     command
         .arg("migrate")
-        .arg("../spec-examples/v1.0.0/simple-item.json")
+        .arg("../../spec-examples/v1.0.0/simple-item.json")
         .arg("--version")
         .arg("1.1.0")
         .assert()
diff --git a/core/tests/examples.rs b/crates/core/tests/examples.rs
similarity index 68%
rename from core/tests/examples.rs
rename to crates/core/tests/examples.rs
index 575da41c..dcef383e 100644
--- a/core/tests/examples.rs
+++ b/crates/core/tests/examples.rs
@@ -3,13 +3,13 @@ use stac::{ValidateBlocking, Value};
 use std::path::PathBuf;
 
 #[rstest]
-fn v1_0_0(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
+fn v1_0_0(#[files("../../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
     value.validate_blocking().unwrap();
 }
 
 #[rstest]
-fn v1_1_0(#[files("../spec-examples/v1.1.0/**/*.json")] path: PathBuf) {
+fn v1_1_0(#[files("../../spec-examples/v1.1.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
     value.validate_blocking().unwrap();
 }
diff --git a/core/tests/migrate.rs b/crates/core/tests/migrate.rs
similarity index 76%
rename from core/tests/migrate.rs
rename to crates/core/tests/migrate.rs
index 31ddaa79..6d62ebdb 100644
--- a/core/tests/migrate.rs
+++ b/crates/core/tests/migrate.rs
@@ -3,7 +3,7 @@ use stac::{Migrate, ValidateBlocking, Value, Version};
 use std::path::PathBuf;
 
 #[rstest]
-fn v1_0_0_to_v1_1_0(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
+fn v1_0_0_to_v1_1_0(#[files("../../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
     let value = value.migrate(&Version::v1_1_0).unwrap();
     value.validate_blocking().unwrap();
diff --git a/duckdb/duckdb-test/Cargo.toml b/crates/duckdb/duckdb-test/Cargo.toml
similarity index 100%
rename from duckdb/duckdb-test/Cargo.toml
rename to crates/duckdb/duckdb-test/Cargo.toml
diff --git a/duckdb/duckdb-test/src/lib.rs b/crates/duckdb/duckdb-test/src/lib.rs
similarity index 100%
rename from duckdb/duckdb-test/src/lib.rs
rename to crates/duckdb/duckdb-test/src/lib.rs
diff --git a/pgstac/pgstac-test/.gitignore b/crates/pgstac/pgstac-test/.gitignore
similarity index 100%
rename from pgstac/pgstac-test/.gitignore
rename to crates/pgstac/pgstac-test/.gitignore
diff --git a/pgstac/pgstac-test/Cargo.toml b/crates/pgstac/pgstac-test/Cargo.toml
similarity index 100%
rename from pgstac/pgstac-test/Cargo.toml
rename to crates/pgstac/pgstac-test/Cargo.toml
diff --git a/pgstac/pgstac-test/src/lib.rs b/crates/pgstac/pgstac-test/src/lib.rs
similarity index 100%
rename from pgstac/pgstac-test/src/lib.rs
rename to crates/pgstac/pgstac-test/src/lib.rs