Skip to content

Commit

Permalink
Extract actix backend into a feature
Browse files Browse the repository at this point in the history
  • Loading branch information
feliwir committed Feb 27, 2024
1 parent 9db7085 commit f1a1aec
Show file tree
Hide file tree
Showing 13 changed files with 97 additions and 83 deletions.
17 changes: 9 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/simple_server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use dicom::{
};
use dicom_object::FileDicomObject;
use dicomweb_server::{
dicomweb_config, study_filter, QidoInstanceQuery, QidoSeriesQuery, QidoStudyQuery,
actix::dicomweb_config, study_filter, QidoInstanceQuery, QidoSeriesQuery, QidoStudyQuery,
INSTANCE_TAGS, SERIES_TAGS, STUDY_TAGS,
};
use itertools::Itertools;
Expand Down
11 changes: 8 additions & 3 deletions server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,16 @@ edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[features]
default = ["actix"]
actix = ["dep:actix-web", "dep:actix-multipart", "dep:actix-utils"]

[dependencies]
actix-multipart = "0.6.1"
actix-utils = "3.0.1"
actix-web = "4.5.1"
actix-multipart = { version = "0.6.1", optional = true }
actix-utils = { version = "3.0.1", optional = true }
actix-web = { version = "4.5.1", optional = true }
bytes = "1.5.0"
derive_more = "0.99.17"
dicom = "0.6.3"
dicom-json = "0.1.1"
dicom-object = "0.6.3"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use actix_utils::future::{ready, Ready};
use actix_web::{dev::Payload, Error, FromRequest, HttpRequest};

use crate::multipart::MultipartReader;
use super::MultipartReader;

impl FromRequest for MultipartReader {
type Error = Error;
Expand Down
28 changes: 28 additions & 0 deletions server/src/actix/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
mod extractor;
mod multipart;
mod qido;
mod stow;
mod wado;

use multipart::*;
use qido::*;
use stow::*;
use wado::*;

pub use qido::qido_config;
pub use stow::stow_config;
pub use wado::wado_config;

pub fn dicomweb_config(cfg: &mut actix_web::web::ServiceConfig) {
cfg.service(store_instances)
.service(store_instances_for_study)
.service(search_studies_all)
.service(search_series_all)
.service(search_series_study_level)
.service(search_instances_all)
.service(search_instances_study_level)
.service(search_instances_series_level)
.service(retrieve_instance)
.service(retrieve_series)
.service(retrieve_study);
}
5 changes: 5 additions & 0 deletions server/src/actix/multipart/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod reader;
mod writer;

pub use reader::*;
pub use writer::*;
File renamed without changes.
File renamed without changes.
41 changes: 3 additions & 38 deletions server/src/qido.rs → server/src/actix/qido.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,8 @@
use actix_web::{get, web, HttpResponse, Responder};
use dicom_json::DicomJson;
use dicom_object::{InMemDicomObject, Tag};
use serde::Deserialize;

use crate::DicomWebServer;

/// QIDO-RS
///
/// See https://www.dicomstandard.org/using/dicomweb/query-qido-rs for more information
/// More detail can be found in PS3.18 10.6.
#[derive(Deserialize, Debug)]
pub struct QidoStudyQuery {
pub limit: Option<usize>,
pub offset: Option<usize>,
pub fuzzymatching: Option<bool>,
#[serde(skip_deserializing)]
pub includefields: Vec<String>,
#[serde(skip_deserializing)]
pub matches: Vec<(Tag, String)>,
}
use dicom_object::InMemDicomObject;

use crate::{DicomWebServer, QidoInstanceQuery, QidoSeriesQuery, QidoStudyQuery};

#[get("/studies")]
pub async fn search_studies_all(
Expand All @@ -45,16 +29,6 @@ pub async fn search_studies_all(
}
}

#[derive(Deserialize, Debug)]
pub struct QidoSeriesQuery {
limit: Option<usize>,
offset: Option<usize>,
includefield: Option<String>,
modality: Option<String>,
series_instance_uid: Option<String>,
series_description: Option<String>,
}

#[get("/studies/{study_uid}/series")]
pub async fn search_series_study_level(
callbacks: web::Data<DicomWebServer>,
Expand Down Expand Up @@ -132,15 +106,6 @@ pub async fn search_series_all(
}
}

#[derive(Deserialize, Debug)]
pub struct QidoInstanceQuery {
limit: Option<usize>,
offset: Option<usize>,
includefield: Option<String>,
sop_instance_uid: Option<String>,
instance_number: Option<String>,
}

#[get("/studies/{study_uid}/series/{series_uid}/instances")]
pub async fn search_instances_series_level(
callbacks: web::Data<DicomWebServer>,
Expand Down
4 changes: 3 additions & 1 deletion server/src/stow.rs → server/src/actix/stow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ use dicom_json::DicomJson;
use dicom_object::{FileDicomObject, InMemDicomObject};
use futures_util::StreamExt;

use crate::{multipart::MultipartReader, DicomWebServer};
use crate::DicomWebServer;

use super::MultipartReader;

async fn collect_dicom_files(
request: HttpRequest,
Expand Down
2 changes: 1 addition & 1 deletion server/src/wado.rs → server/src/actix/wado.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::io::Write;

use actix_web::{get, web, HttpResponse, Responder};

use crate::{multipart::MultipartWriter, DicomWebServer};
use crate::{actix::MultipartWriter, DicomWebServer};

/// WADO-RS
///
Expand Down
62 changes: 38 additions & 24 deletions server/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,48 @@
use dicom::{dictionary_std::tags, object::InMemDicomObject};
use serde::Deserialize;

mod filter;
mod multipart;
mod qido;
mod stow;
mod wado;

use dicom_object::{FileDicomObject, Tag};
use qido::*;
use stow::*;
use wado::*;

pub use filter::study_filter;
pub use qido::{qido_config, QidoInstanceQuery, QidoSeriesQuery, QidoStudyQuery};
pub use stow::stow_config;
pub use wado::wado_config;

#[cfg(feature = "actix")]
pub mod actix;

/// QIDO-RS
///
/// See https://www.dicomstandard.org/using/dicomweb/query-qido-rs for more information
/// More detail can be found in PS3.18 10.6.
#[derive(Deserialize, Debug)]
pub struct QidoStudyQuery {
pub limit: Option<usize>,
pub offset: Option<usize>,
pub fuzzymatching: Option<bool>,
#[serde(skip_deserializing)]
pub includefields: Vec<String>,
#[serde(skip_deserializing)]
pub matches: Vec<(Tag, String)>,
}

#[derive(Deserialize, Debug)]
pub struct QidoSeriesQuery {
limit: Option<usize>,
offset: Option<usize>,
includefield: Option<String>,
modality: Option<String>,
series_instance_uid: Option<String>,
series_description: Option<String>,
}

#[derive(Deserialize, Debug)]
pub struct QidoInstanceQuery {
limit: Option<usize>,
offset: Option<usize>,
includefield: Option<String>,
sop_instance_uid: Option<String>,
instance_number: Option<String>,
}

/// DICOMWeb Server
/// Provide the callbacks for the QIDO-RS and WADO-RS endpoints.
Expand Down Expand Up @@ -76,17 +104,3 @@ pub const INSTANCE_TAGS: [Tag; 3] = [
tags::SOP_INSTANCE_UID,
tags::INSTANCE_NUMBER,
];

pub fn dicomweb_config(cfg: &mut actix_web::web::ServiceConfig) {
cfg.service(store_instances)
.service(store_instances_for_study)
.service(search_studies_all)
.service(search_series_all)
.service(search_series_study_level)
.service(search_instances_all)
.service(search_instances_study_level)
.service(search_instances_series_level)
.service(retrieve_instance)
.service(retrieve_series)
.service(retrieve_study);
}
6 changes: 0 additions & 6 deletions server/src/multipart/mod.rs

This file was deleted.

0 comments on commit f1a1aec

Please sign in to comment.