All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.7.0-beta.3 - 2025-03-23
- [breaking] Allow either http or grpc OTLP endpoints (#701)
0.7.0-beta.2 - 2025-03-15
- Make
AnyInitializer#stage
field non-optional (#676)
- Update leptos-ssr example to leptos-0.8 and update various dependencies (#689)
- Various updates to the documentation + book + book examples
0.7.0-beta.1 - 2025-03-04
- Allow logging sensitive headers in the dev environment (#666)
- Allow overriding config fields or entire config (#661)
- Accept
Into<String>
forConfigOverrideSource
builder (#670)
- Export
TestAppState
to allow for external use (#672)
- Update to rust 2024 edition + rustfmt 2024 style edition (#662)
0.7.0-beta - 2025-02-25
This is the first beta release for version 0.7.0. From here until the stable 0.7.0 release, the focus will be on improving docs and internal clean up. Semver breaking changes are not expected going forward for 0.7.0, but are still possible.
- Update OTEL dependencies (#659)
0.7.0-alpha.8 - 2025-02-25
- [breaking] Allow customizing the Diesel pool connections (#656)
0.7.0-alpha.7 - 2025-02-25
- [breaking] Refactor app runners and change command + lifecycle params (#652)
- minor re-word in db book chapter (#651)
0.7.0-alpha.6 - 2025-02-24
- Create temporary databases for tests (#645)
- [breaking] Add test hook (#643)
- [breaking] Fix
run_test*
to skip CLI (#647)
- Fix powerset checks (#648)
0.7.0-alpha.5 - 2025-02-20
- Support mysql test container (#636)
- Use
db-sql
instead ofdb-sea-orm
where appropriate (#637)
- Remove unnecessary
Empty
forRoadsterApp
Cli
type (#633) - Add
diesel
toloco
comparison page (#632) - Update db chapter of book (#631)
0.7.0-alpha.4 - 2025-02-18
This is a very large release with a lot of breaking changes. See the below changelog the detailed commit history. In summary, this release adds support for the Diesel SQL ORM. Diesel is a very different ORM compared to SeaORM (the ORM we currently support), and as such this release required a lot of refactoring in order to provide a relatively consistent experience regardless of which ORM a consumer decides to use (or if they decide to use both, which is possible but not particularly recommended). The refactor also resulted in some general simplifications and improvements to the devx; read on for more details. Some breaking changes include:
- Remove the
M
associated type from theApp
trait. AMigrator
can now be provided via themigrators
method instead. - Similarly, remove the
M
type parameter fromRoadsterApp
. SeaORM, Diesel, or a genericMigrator
can now be provided via the builder methods. - Change
RunCommand#run
to take a singlePreparedApp
struct - ^This allowed removing the CLI handler method from the
AppService
trait. CLI's now have access to theServiceRegistry
from thePreparedApp
, so they can get access to a particularAppService
usingServiceRegistry#get
(assuming it was registered). - Consolidate DB migration CLI commands to provide consistent experience between SeaORM and Diesel. This also removed some slightly redundant commands.
- Rename
AppContext#db
toAppContext#sea_orm
- Rename
App#db_connection_options
toApp#sea_orm_connection_options
, and rename the related methods inRoadsterApp
- Move/rename the DB health check
- Add
Sized
as a parent trait for theApp
This release also includes the following non-breaking changes:
- Add
AppContext
methods to get various Diesel connection pools types, including Postgres, Mysql, Sqlite, and async pools for Postgres and Mysql. Due to Diesel's type strategy for connections, there isn't a single "DbConnection" like there is in SeaORM, so we provide individual methods depending on which feature flags are enabled. - Allow providing
AsyncSource
implementations to use with theconfig
crate. This allows, for example, loading secret config values from an external service, such as AWS or GCS secrets managers. - Add a couple db config fields,
test-on-checkout
andretry-connection
- Add more variants to our custom
Error
type
- [breaking] Add
diesel
support (#626) - [breaking] Add
db-sea-orm
feature to prepare for other DB crate support (#612)
- Kebab case for environment env var instead of lowercase (#614)
- [breaking] Replace native-tls with rustls in several dependencies (#621) thanks to @tomtom5152
- [breaking] Remove
AppContext::mailer
method in favor of thesmtp
method (#613) - Remove leptos-0.6 example so to maintain a single leptos example (#610)
- Add doc comments for
Provide
andProvideRef
and add to book (#598) - Minor improvement to initializing health checks in state (#593)
- Refactor
RoadsterApp
to reduce duplication (#589) - Add example of using tower/axum
oneshot
to test APIs (#587) - Improve test coverage (#582)
- Update the validator trait (#585)
- Various documentation + test improvements
0.7.0-alpha.3 - 2025-01-22
- [breaking] Enable fetching concrete service from registry via downcast (#580)
- [breaking] Rename/move the
health_check
mod tohealth::check
(#578) - [breaking] Remove the
App#graceful_shutdown
method (#577) - Add
ExampleHealthCheck
to thefull
example (#576)
0.7.0-alpha.2 - 2025-01-18
- Map
Error::Auth
toStatusCode::UNAUTHORIZED
HTTP response (#571) - [breaking] Return
RedisEnqueue
andRedisFetch
redis pool "new-types" (#568)
- Remove todos (#570)
- [breaking] Remove
From<Environment>
impl for&'static str
(#569) - Declare all dependencies in workspace (#567)
- [breaking] Remove deprecated items (#566)
0.7.0-alpha.1 - 2025-01-17
- [breaking] Allow registering
Worker
instead of requiringAppWorker
(#564) - Increase the default cache-control max-age to 1 week (#559)
- Use
Router#fallback_service
inNormalizePathInitializer
(#562)
- Update
config
to 0.15.6 (#560)
0.7.0-alpha - 2025-01-14
- Support sidekiq balance strategy and dedicated queues (#543)
- [breaking] Propagate
Validate
calls to all app config fields (#557)
- [breaking] Update bb8 to v0.9 and sidekiq-rs to 0.13.1 (#555)
- Add some details to config book page (#553)
- Upgrade various crates that are used internally (#551)
- [breaking] Upgrade Axum to 0.8 and Aide to 0.14 (#548)
- Enable nightly coverage feature (#545)
0.6.24 - 2024-12-28
- Add cache-related middlewares (#541)
- Add timestamps for when email change is confirmed (#537)
- Add User column to store the user's new email before it's confirmed (#536)
0.6.23 - 2024-12-24
- Enable redacting timestamps from
insta
snapshots (#532) - Add
AppWorker#enqueue_delayed
(#531)
0.6.22 - 2024-12-07
- Add
AppContextWeak
to prevent reference cycles (#529)
0.6.21 - 2024-12-01
- Update OTEL patch version and remove a deprecated fn call (#527)
- Update Loco comparisons and add some links to other sections (#522)
- Add mailpit to SMTP dev server examples (#521)
- (deps) bump codecov/codecov-action from 4 to 5 (#517)
- Upgrade otel/tracing dependencies (#516)
0.6.20 - 2024-11-17
- Enable converting
roadster::Error
tosidekiq::Error
(#514)
- Use
MockProvideRef<DatabaseConnection>
in an example test (#513)
0.6.19 - 2024-11-16
Provide
andProvideRef
traits to provideAppContext
objects (#510)
0.6.18 - 2024-11-15
- Add support for redacting postgres/redis/smtp URIs (#507)
- Add
smtp4dev
to example local SMTP servers (#506)
0.6.17 - 2024-11-12
- Add support for TestContainers (pgsql + redis modules) (#503)
0.6.16 - 2024-10-28
- Add config to specify the domain where the service is hosted (#490)
0.6.15 - 2024-10-22
- Case-insensitive username and email fields (#480)
0.6.14 - 2024-10-21
- Add
AnyMiddleware
to minimize boilerplate for Axum middleware (#472) - Add
AnyIntializer
to minimize boilerplate for Axum Router initializers (#475)
- Add leptos-0.7 example (#465)
0.6.13 - 2024-10-19
- Only attempt to load yaml files when
config-yaml
is enabled (#451)
- Use
FromRef
fromaxum-core
instead ofaxum
(#450)
0.6.12 - 2024-10-17
- Enable writing config files in YAML (#446)
0.6.11 - 2024-10-17
- Fix trace message for health checks on startup (#443)
- Add loco comparison (#444)
0.6.10 - 2024-10-16
- Enable consumers to provide custom Environment values (#439)
0.6.9 - 2024-10-15
- Add
AppContext::smtp
method to alias toAppContext::mailer
(#409) - Create documentation website using mdbook. The website can be found at roadster.dev.
0.6.8 - 2024-10-11
- Allow configuring which req/res body content types to log (#407)
0.6.7 - 2024-10-11
The main feature included in this release is support for sending emails via Sendgrid's Mail Send API. See the below items for more details.
- Set sandbox mode on Sendgrid message based on config (#403)
- Add Sendgrid client to
AppContext
(#402) - Add support to config for email via Sendgrid (
email-sendgrid
feature) (#401)
0.6.6 - 2024-10-10
- Allow configuring the interval at which metrics are exported (#399)
0.6.5 - 2024-10-09
The main feature included in this release is support for sending emails via SMTP. See the below items for more details.
- Add
SmtpHealthCheck
(#396) - Allow specifying the smtp port via config (#395)
- Add smtp client to
AppContext
(#391) - Add support to config for email via SMTP (
email-smtp
feature) (#388)
- Fix config value used for timeout of health check in api and cli (#397)
- Add example of sending email using lettre smtp client (#394)
- Add doc comment explaining how NormalizePathLayer works (#393)
0.6.4 - 2024-10-05
0.6.3 - 2024-09-15
- Add logs for successful health checks (#371)
0.6.2 - 2024-08-30
0.6.1 - 2024-08-28
- Allow running CLI commands without requiring DB/Redis connections (#353)
- Update
typed-builder
and several examples' dependencies (#352)
0.6.0 - 2024-08-25
- Add a public method to decode a JWT from a string (#348)
- Mark refresh token headers as sensitive (#347)
- Make the
User
sea-orm migration enum public (#346) - Allow splitting config files into many files in env directories (#344)
- [breaking] App methods take
self
(#337) - Remove cookie extraction for
Jwt
, but allow it inJwtCsrf
(#332) - Allow custom sub-claims in provided
Claims
types (#331) - Allow jwt from cookie, but only if it's explicitly requested (#329)
- [breaking] Don't expect a "Bearer" token in the auth token cookie (#340)
- Update leptos example to use site-addr and env from roadster config (#341)
- sea-orm workspace dep and upgrade to
1.0.0
(#336) - [breaking] Update tower to
0.5.0
(#334)
0.5.19 - 2024-08-12
- Redact bearer tokens in insta snapshots (#325)
- Do not simply use bearer token from cookie for auth (#326)
- Derive
Clone
in JWT claim types (#323) - Implement
From
for variousSubject
enum variants (#323) - Use
leptos_routes
in leptos example instead ofleptos_routes_with_context
(#322)
- (deps) Bump EmbarkStudios/cargo-deny-action from 1 to 2 (#319)
0.5.18 - 2024-08-05
- Update
rstest
dependency (#318)
0.5.17 - 2024-08-05
- Extract jwt as a bearer token from cookies (#316)
0.5.16 - 2024-08-04
- Extract JWT from cookie (#314)
- Derive
OperationIo
forJwt
struct (#311) - Change user.last_sign_in_at column to non-null with default (#312)
- Add pre-commit hook to check formatting (#313)
0.5.15 - 2024-08-01
- Allow configuring the max len for the
ReqResLoggingMiddleware
(#309)
0.5.14 - 2024-08-01
- Enable ReqResLogging middleware by default, but disable in prod (#307)
0.5.13 - 2024-07-31
- Add middleware to log the request/response payloads (#304)
- Log errors at debug level in
IntoResponse
impl (#303)
0.5.12 - 2024-07-29
- PasswordUpdatedAt column + auto-update with a fn and trigger (#301)
0.5.11 - 2024-07-26
- Migration to enable the uuid-ossp Postgres extension (#297)
- Add non-pk versions of uuid schema helper methods (#296)
0.5.10 - 2024-07-25
- Use IDENTITY column for int primary keys instead of BIGSERIAL (#293)
- Add "if exists" to user's drop_table migration statement (#292)
- Add tests for schema and check helper methods (#289)
0.5.9 - 2024-07-24
- Disallow
unwrap
andexpect
except in tests (#286)
0.5.8 - 2024-07-22
- Remove the
update
justfile command (#282) - Use the main project README.md as the library's top-level docs (#281)
0.5.7 - 2024-07-22
- Update dependencies (#279)
0.5.6 - 2024-07-22
- Add
TestCase
utility for configuringinsta
settings (#277)
0.5.5 - 2024-07-08
- Allow configuring the tracing log output format (#275)
0.5.4 - 2024-07-07
- Add method to prepare the app separately from running it (#270)
- Correctly add the
ApiRouter
to the HTTP service'sApiRouter
(#273)
- Fixes for default openapi docs (#271)
0.5.3 - 2024-07-04
- Update the
_health
HTTP API docs (#267)
0.5.2 - 2024-07-02
- Allow configuring the max duration of health checks (#264)
0.5.1 - 2024-07-02
- Place health check results under
resources
in response (#261)
- Fix typos in README (#260)
0.5.0 - 2024-07-01
- [breaking] Remove interior mutability of
HealthCheckRegistry
(#258)
0.4.0 - 2024-07-01
- [breaking] Implement health check API using
HealthCheck
trait (#255) - [breaking] Switch to Axum's
FromRef
for custom state (#250)
- [breaking] Remove deprecated items in preparation of 0.4 release (#253)
- Add example for integrating with Leptos (#252)
- Use small number of sidekiq workers for
full
example in dev/test (#251)
0.3.5 - 2024-06-24
- Health check config is missing a
custom
field (#246)
- Check PR title for compliance with conventional commits (#247)
0.3.4 - 2024-06-23
- Add health checks to run before starting services (#242)
- Add
From
impl to convert db config to ConnectOptions (#240) - Move sidekiq "stale cleanup" to new
before_run
service method (#239)
- Add dependabot config to update github actions weekly (#243)
- Update READMEs to use
__
as the env var separator instead of.
- Update list of UI frameworks in readme
- Set up
cargo deny
0.3.3 - 2024-06-21
- Invalid env var separator on bash
- Add inclusive language check to CI
- Fix clippy error
- Remove non-inclusive language
0.3.2 - 2024-06-14
- Run Feature Powerset checks + perform a release twice a week
- Add goals and future plans to readme + some getting started steps
- Add github action to verify commits follow 'Conventional Commits' format
0.3.1 - 2024-06-11
- Implement the health check API as a protocol agnostic
core
module - Minor changes to the
FunctionService
doc example
0.3.0 - 2024-06-10
- Fix minimal version of serde
- Add #[non_exhaustive] to public enums
- Add Add #[non_exhaustive] to public structs
- Enable grpc by default in the
full
example - Add support for tower's CORS middleware
- Add AppMetadata struct + App::metadata method and add version to otel
- Run doctests as part of test and test-watch just commands
- Update readme to include grpc and generic function service
- Update FunctionService doctest to only run with default features
- Add a generic app service to run an async function as a service
- Move semver checks to a separate workflow
- Use depth 3 in feature powerset
- Install protoc in feature powerset workflow
- Remove the old deprecated cli mod
- Add basic grpc example
- Add basic support for serving a gRPC service
- Update rstest
0.2.6 - 2024-06-03
- Add builder method to add middleware for the sidekiq processor
- Declare minimal version of dependencies that's actually needed
- Add
cargo-minimal-versions
for direct dependencies
0.2.5 - 2024-06-03
- Only test the
AppConfig#test
method when all (most) features are enabled - Hard-code the number of sidekiq workers to avoid snapshot failures
- Ignore a clippy error
- Ignore coverage for the
AppConfig#test
method - Provide config defaults via config files
- Move database and tracing mods to directories
- Upgrade dependencies
0.2.4 - 2024-05-31
- Upgrade dependencies
0.2.3 - 2024-05-27
- Remove
http
feature gate forapi
mod - Move cli mod to be a child of the api mod
- Add semver checks to CI
- Revert "Use stable rust for coverage"
0.2.2 - 2024-05-26
- Add latest version of
time
to workaround build issue on nightly
0.2.1 - 2024-05-26
- Add missing
needs
field topowerset_clippy
workflow step - Run separate jobs for each feature powerset check
0.2.0 - 2024-05-26
- Add custom error type using
thiserror
- Fix incorrect feature flag used on import statement
- Allow partial overrides of all configs
- Remove mock
AppContext
and use a concrete version in tests instead - Add a small description for the
validate-codecov-config
just cmd - Use automock to mock traits instead of the mock! macro
- Use github discussions instead of discord (for now at least)
- Add tests for controller config methods
- Fix exiting the app when a cli command is handled
- Allow running the release_pr workflow manually
- Add code owners to automatically request reviews on PRs
- Add documentation for the TestCase utility class
- Use stable rust for coverage
- Add tests for sidekiq builder and roadster cli
- Run release pr workflow with manual dispatch
- Separate different parts of the app::start method into respective mods
- Add tests for the
DefaultRoutes
config validator - Fix
DefaultRoutes
validator when open-api feature is not enabled - Add validation of the AppConfig
- Add deps.rs badge to readme
- Group
http
andopen-api
features in the feature_powerset workflow - Update the codecov PR comment config
- Add tests for
remove_stale_periodic_jobs
- Update dependencies that can be updated
- Add a feature flag to entirely disable the http service
- Add comments to justfile
- Update dependencies and add
just
command to update deps - Add MSRV tag to readme
- Add MSRV and add CI step to validate
- Add some tests for
SidekiqWorkerServiceBuilder
- Add justfile
- Add tests for
SidekiqWorkerService::enabled
- Fix clippy warning
- Allow unknown cfg in coverage workflow
- Disable coverage for tests
- Enable running coverage using the nightly toolchain
- Add tests for the Middleware::priority methods for each middleware
- Add tests for the Middleware::enabled method for each middleware
- Add tests for the default_middleware and default_initializers methods
- Add tests for middleware/initializer registration in HttpServiceBuilder
- Don’t use coverage(off) for now because it’s unstable
- Use coverage instead of coverage_nightly
- Apply coverage(off) directly to the desired method
- Use coverage(off) only with cfg_attr(coverage)
- Disable coverage for service mod test impls
- Add small test for service builder
- Remove async-std from dev deps
- Remove Tokio from non-async test
- Use Tokio for rstest tests
- Run
cargo upgrade
to update dependencies - Update the code coverage comment format
- Set up mocking using
mockall
crate - Do some test cleanup
- Add test for route that isn't documented
- Add test for the HttpService::list_routes method/cli command
- Rename the custom context in the minimal example
- Remove unnecessary
From...
impl forAppContext
- Pass config and context by reference in all public APIs
- Custom state as member of
AppContext
- Add methods to AppContext instead of direct field access
- Fix codecov config
- Add tests to serde_util
- Add codecov config file
- Update instructions to run CI locally
- Add coverage badge to the readme
- Add workflow to generate code coverage stats
- Disallow registering things multiple times
- Create FUNDING.yml
- Update feature_powerset.yml schedule
- Rearrange and enhance the status badges in the readme
- Add a Discord badge
- Have docs.rs pass --all-features to ensure all features have docs built
0.1.1 - 2024-05-05
- Only run the release workflow on main
- Install missing nextest dependency for feature powerset
- Add crates.io and docs.rs badges
- Run the release workflow after the
Feature Powerset
workflow succeeds
0.1.0 - 2024-05-05
- Set
publish = false
in the minimal example Cargo.toml - Set
publish = true
in the Cargo.toml - Remove fetch depth of 0 from CI and feature powerset
- Automate releases with release-plz
- Use fetch depth of 0 in CI
- Remove
lazy_static
dependency - Use the nextest test runner
- Upgrade dependencies in
Cargo.toml
s - Fix the graceful shutdown of the sidekiq service
- Timeout the ping redis method so the health route can return without fully timing out
- Implement the sidekiq processor task as an
AppService
- Move middleware/initializers to service/http module
- Add
ServiceRegistry
and restructure configs - Add
AppService
trait and use it to implement the HTTP service - Add example worker and api to the
minimal
example - Don't run Processor depending on configs
- Use a separate redis connection pool for enqueuing vs fetching jobs
- Remove
url::Url
import fromapp_config.rs
forsidekiq
feature - Allow configuring the number of sidekiq worker tasks
- Remove stale periodic jobs
- Enable registering periodic workers
- Check disk usage between feature powerset workflow steps
- Add defaults for
AppWorkerConfig
's builder - Add RoadsterWorker to provide common behaviors for workers
- Add instructions for RedisInsight to the readme
- Add standalone sidekiq dashboard instructions to readme
- Clean between powerset build stages
- Skip and group features to reduce powerset size
- Use cfg feature flag instead of allowing unused import
- Add feature flag to enable exporting traces/metrics using otel
- Add to list of features in readme
- Add CLI command to print the app config
- Add CLI commands to run DB migrations
- Add CLI command to generate an openapi schema
- Allow private intra doc links for rustdoc
- Add CLI command to list API routes
- Set up roadster CLI and custom app CLI
- Fix the cron used for
feature_powerset.yml
workflow - Remove a
cfg
that caused a build error - Add doc comment for
Initializer::priority
- Allow using custom App::State in Initializer and Middleware traits
- Remove debugging outputs
- Fix step names used to define outputs
- Add missing runs-on field
- Add debugging log to workflow
- Add log of label name
- Use uniq job output names
- Fix error in feature_powerset.yml
- Allow triggering the feature powerset check by adding a lable to a pr
- Add missing cfg for the
open-api
feature - Fix a powerset build error
- Add
Swatinem/rust-cache@v2
to cache rust builds - Update checkout action version
- Add
workflow_dispatch
event to feature_powerset.yml - Add github workflow to run checks against the powerset of features
- Remove "all features" job b/c it's a duplicate of the cargo hack job
- Use
cargo hack --each-feature
instead of--feature-powerset
- Add openid jwt claims
- Minor changes
- Fix build break with all features disabled
- Enable reporting traces/metrics via an otlp exporter
- Use snake case in github ci job
- Add RequestDecompressionMiddleware
- Add more crate-level documentation
- Create LICENSE
- Move workspace declaration to the bottom of the Cargo.toml
- Fix a
rustdoc::all
warning - Remove
--no-dev-deps
where it can't be used in github ci workflow - Use
cargo hack
to test feature powerset - Update cargo checks
- Fix cargo fmt command
- Create workspace that includes the examples
- Set working dir for examples job
- Add a minimal example
- Don't run clippy against deps in ci
- Add CI badge to the readme
- Update checkout action to v4
- Add workflow stage to run checks for all features
- Add missing checkout in workflow
- Use custom husky hooks
- Add github workflow to run checks with all feature combinations
- Add feature flag for generating openapi schema using
aide
- Add feature flag for the SQL db
- Add feature flag for sidekiq
- Add RequestBodyLimitMiddleware
- Add TimeoutLayer middleware
- Add instructions for generating an html coverage report
- Use
JoinSet
instead ofTaskTracker
- Make the Jwt claims type generic and use
Claims
as the default - Add notes on background job queue options
- Add JWT extractor with basic Claims impl for default/recommended claims
- Add logs for sidekiq queues
- Add ping latencies to health check response
- Allow configuring the max number of redis connections
- Don't bail early in graceful shutdown if an error occurred.
- Minor string change
- Remove
instrument
fromcancel_on_error
- Remove
log
from dependencies - Improve graceful shutdown logic
- Always run shutdown logic and don't require consumer to run it
- Add token cancelation drop guard, and add doc comment recommending to use the default shutdown signal
- Add logs for installing middleware
- Add compression middleware
- Remove stray log
- Add catch panic middleware
- Add graceful shutdown signal
- Add rusty-sidekiq for running async jobs
- Add
_health
route to check the health of the service - Enable migrations
- Add SeaORM integration
- Enable custom configs for initializers
- Add Initializer with various hooks, and add NormalizePathInitializer
- Minor change to concat middleware vecs inline
- Don't require consumers to include default middleware
- Reorder default middleware -- order determined by config now
- Enable providing configs for custom middleware
- Enable configuring middleware
- Add environment to the AppConfig
- Add OpenAPI docs + spec routes
- Add tracing middleware
- Add request id middleware
- Allow middleware installers to return a result
- Enable adding middleware and provide defaults
- Require custom state to be convertable to AppContext
- Add default _ping route
- Enable defining routes using Axum or Aide routers
- Use From trait instead of a custom trait
- Re-order dependencies in Cargo.toml
- Add App trait and allow providing a custom state
- Add app entrypoint
- Init tracing
- Add basic configuration support
- Remove .idea directory
- Remove Cargo.lock from git
- Move cargo-husky to dev-deps
- Prevent publishing for now
- Add cargo-husky
- Init and add empty rust lib project