# firestore_grpc_cloudrun A gRPC client library for Firestore, intended to run on Cloud Run. ## Usage Add this to your `Cargo.toml`: ``` toml [dependencies] firestore = { version = "0.1", package = "firestore_grpc_cloudrun" } ``` ## Examples ### `CreateDocument` #### Create a new app ```bash cargo new firestore-rust && cd firestore-rust ``` #### `src/main.rs` ``` rust use firestore::*; use futures::try_join; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response, Server}; use std::convert::Infallible; use std::net::SocketAddr; #[tokio::main] async fn main() { let addr = SocketAddr::from(([0, 0, 0, 0], get_port())); let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(root)) }); let server = Server::bind(&addr).serve(make_svc); if let Err(e) = server.await { eprintln!("server error: {}", e); } } async fn root(_req: Request) -> Result, Infallible> { let res = if let Ok(doc) = create_document().await { format!("Document: {:?}", doc) } else { "Failed to get document.".into() }; Ok(Response::new(res.into())) } async fn create_document() -> Result { let (mut client, project_id) = try_join!( get_client(), get_project_id(), )?; let parent = format!("projects/{}/databases/(default)/documents", project_id); let collection_id = "greetings".into(); let document_id = "".into(); let mut fields = std::collections::HashMap::new(); fields.insert( "message".into(), Value { value_type: Some(value::ValueType::StringValue( "Hello world from CloudRun!".into(), )), }, ); let document = Some(Document { name: "".into(), fields, create_time: None, update_time: None, }); let res = client .create_document(CreateDocumentRequest { parent, collection_id, document_id, document, mask: None, }) .await?; Ok(res.into_inner()) } fn get_port() -> u16 { std::env::var("PORT") .ok() .and_then(|x| x.parse().ok()) .unwrap_or(8080) } ``` #### `Cargo.toml` ``` toml [dependencies] firestore = { version = "*", package = "firestore_grpc_cloudrun" } futures = "0.3" hyper = "0.13" tokio = { version = "0.2", features = ["full"] } ``` #### `Dockerfile` ``` Dockerfile FROM rust:1-stretch as build-env WORKDIR /app ADD . . RUN rustup update && rustup component add rustfmt && cargo build --release FROM debian:stretch-slim WORKDIR /app RUN apt-get update && apt-get install -y libgcc1 libgomp1 libstdc++6 ca-certificates && update-ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=build-env /app/target/release/firestore-rust /app/main ENTRYPOINT ["./main"] ```