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.

128 lines
3.9 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 (non_blocking, _guard) =
  72. tracing_appender::non_blocking(std::io::stdout());
  73. let _ = LogTracer::init().map_err(|err| {
  74. io::Error::new(
  75. ErrorKind::Other,
  76. format!("Failed to set up log tracer: {:?}", err),
  77. )
  78. })?;
  79. let bi = actix_demo::get_build_info();
  80. let _ = match format {
  81. LoggerFormat::Json => {
  82. let formatting_layer = BunyanFormattingLayer::new(
  83. format!("actix-demo-{}", bi.crate_info.version),
  84. // Output the formatted spans to non-blocking writer
  85. non_blocking,
  86. );
  87. let subscriber = Registry::default()
  88. .with(env_filter)
  89. .with(JsonStorageLayer)
  90. .with(formatting_layer);
  91. let _ = set_global_default(subscriber).map_err(|err| {
  92. io::Error::new(
  93. ErrorKind::Other,
  94. format!("Failed to set subscriber: {:?}", err),
  95. )
  96. })?;
  97. }
  98. LoggerFormat::Pretty => {
  99. let subscriber = FmtSubscriber::builder()
  100. .pretty()
  101. .with_span_events(FmtSpan::NEW)
  102. .with_span_events(FmtSpan::CLOSE)
  103. .with_env_filter(env_filter)
  104. .finish();
  105. let _ = set_global_default(subscriber).map_err(|err| {
  106. io::Error::new(
  107. ErrorKind::Other,
  108. format!("Failed to set subscriber: {:?}", err),
  109. )
  110. })?;
  111. }
  112. };
  113. Ok(())
  114. }