use dragonfly_api::common::v2::Range;
use dragonfly_client_config::dfdaemon::Config;
use dragonfly_client_core::Result;
use std::cmp::{max, min};
use std::path::Path;
use std::sync::Arc;
#[cfg(target_os = "linux")]
pub type Content = super::content_linux::Content;
#[cfg(target_os = "macos")]
pub type Content = super::content_macos::Content;
pub const DEFAULT_CONTENT_DIR: &str = "content";
pub const DEFAULT_TASK_DIR: &str = "tasks";
pub const DEFAULT_PERSISTENT_TASK_DIR: &str = "persistent-tasks";
pub const DEFAULT_PERSISTENT_CACHE_TASK_DIR: &str = "persistent-cache-tasks";
pub struct WritePieceResponse {
pub length: u64,
pub hash: String,
}
pub struct WritePersistentTaskResponse {
pub length: u64,
pub hash: String,
}
pub struct WritePersistentCacheTaskResponse {
pub length: u64,
pub hash: String,
}
pub async fn new_content(config: Arc<Config>, dir: &Path) -> Result<Content> {
Content::new(config, dir).await
}
pub fn calculate_piece_range(offset: u64, length: u64, range: Option<Range>) -> (u64, u64) {
if let Some(range) = range {
let target_offset = max(offset, range.start);
let target_length =
min(offset + length - 1, range.start + range.length - 1) - target_offset + 1;
(target_offset, target_length)
} else {
(offset, length)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_calculate_piece_range() {
let test_cases = vec![
(1, 4, None, 1, 4),
(
1,
4,
Some(Range {
start: 1,
length: 4,
}),
1,
4,
),
(
1,
4,
Some(Range {
start: 2,
length: 1,
}),
2,
1,
),
(
1,
4,
Some(Range {
start: 1,
length: 1,
}),
1,
1,
),
(
1,
4,
Some(Range {
start: 4,
length: 1,
}),
4,
1,
),
(
1,
4,
Some(Range {
start: 0,
length: 2,
}),
1,
1,
),
(
1,
4,
Some(Range {
start: 4,
length: 3,
}),
4,
1,
),
];
for (piece_offset, piece_length, range, expected_offset, expected_length) in test_cases {
let (target_offset, target_length) =
calculate_piece_range(piece_offset, piece_length, range);
assert_eq!(target_offset, expected_offset);
assert_eq!(target_length, expected_length);
}
}
}