You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.8 KiB

4 years ago
4 years ago
4 years ago
4 years ago
  1. #![forbid(unsafe_code)]
  2. use actix_demo::{AppConfig, AppData, EnvConfig, LoggerFormat};
  3. use diesel::r2d2::ConnectionManager;
  4. use diesel_tracing::sqlite::InstrumentedSqliteConnection;
  5. use io::ErrorKind;
  6. use std::io;
  7. use tracing::subscriber::set_global_default;
  8. use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
  9. use tracing_log::LogTracer;
  10. use tracing_subscriber::fmt::format::FmtSpan;
  11. use tracing_subscriber::{
  12. layer::SubscriberExt, EnvFilter, FmtSubscriber, Registry,
  13. };
  14. #[actix_web::main]
  15. async fn main() -> io::Result<()> {
  16. let _ = dotenv::dotenv().map_err(|err| {
  17. io::Error::new(
  18. ErrorKind::Other,
  19. format!("Failed to set up env: {:?}", err),
  20. )
  21. })?;
  22. let env_config = envy::prefixed("ACTIX_DEMO_")
  23. .from_env::<EnvConfig>()
  24. .map_err(|err| {
  25. io::Error::new(
  26. ErrorKind::Other,
  27. format!("Failed to parse config: {:?}", err),
  28. )
  29. })?;
  30. let _ = setup_logger(env_config.logger_format)?;
  31. let connspec = &env_config.database_url;
  32. let manager =
  33. ConnectionManager::<InstrumentedSqliteConnection>::new(connspec);
  34. let pool = r2d2::Pool::builder().build(manager).map_err(|err| {
  35. io::Error::new(
  36. ErrorKind::Other,
  37. format!("Failed to create pool: {:?}", err),
  38. )
  39. })?;
  40. let _ = {
  41. let conn = &pool.get().map_err(|err| {
  42. io::Error::new(
  43. ErrorKind::Other,
  44. format!("Failed to get connection: {:?}", err),
  45. )
  46. })?;
  47. let _ =
  48. diesel_migrations::run_pending_migrations(conn).map_err(|err| {
  49. io::Error::new(
  50. ErrorKind::Other,
  51. format!("Error running migrations: {:?}", err),
  52. )
  53. })?;
  54. };
  55. let app_data = AppData {
  56. config: AppConfig {
  57. hash_cost: env_config.hash_cost,
  58. },
  59. pool: pool.clone(),
  60. };
  61. actix_demo::run(format!("{}:7800", env_config.http_host), app_data).await
  62. }
  63. pub fn setup_logger(format: LoggerFormat) -> io::Result<()> {
  64. let env_filter =
  65. EnvFilter::try_from_env("ACTIX_DEMO_RUST_LOG").map_err(|err| {
  66. io::Error::new(
  67. ErrorKind::Other,
  68. format!("Failed to set up env filter: {:?}", err),
  69. )
  70. })?;
  71. let _ = LogTracer::init().map_err(|err| {
  72. io::Error::new(
  73. ErrorKind::Other,
  74. format!("Failed to set up log tracer: {:?}", err),
  75. )
  76. })?;
  77. let bi = actix_demo::get_build_info();
  78. let _ = match format {
  79. LoggerFormat::Json => {
  80. let formatting_layer = BunyanFormattingLayer::new(
  81. format!("actix-demo-{}", bi.crate_info.version),
  82. // Output the formatted spans to stdout.
  83. std::io::stdout,
  84. );
  85. let subscriber = Registry::default()
  86. .with(env_filter)
  87. .with(JsonStorageLayer)
  88. .with(formatting_layer);
  89. let _ = set_global_default(subscriber).map_err(|err| {
  90. io::Error::new(
  91. ErrorKind::Other,
  92. format!("Failed to set subscriber: {:?}", err),
  93. )
  94. })?;
  95. }
  96. LoggerFormat::Pretty => {
  97. let subscriber = FmtSubscriber::builder()
  98. .pretty()
  99. .with_span_events(FmtSpan::NEW)
  100. .with_span_events(FmtSpan::CLOSE)
  101. .with_env_filter(env_filter)
  102. .finish();
  103. let _ = set_global_default(subscriber).map_err(|err| {
  104. io::Error::new(
  105. ErrorKind::Other,
  106. format!("Failed to set subscriber: {:?}", err),
  107. )
  108. })?;
  109. }
  110. };
  111. Ok(())
  112. }