base/
util.rs

1use std::{fs::File, io};
2
3use graph_lib::{
4    io::{DataFormat, ParseBuilder},
5    prelude::{DiGraphB, GraphB, UndiGraphB},
6};
7
8#[derive(Debug, serde::Deserialize)]
9pub struct GraphInfo {
10    directed: bool,
11    location: DataLocation,
12    #[serde(default = "default_transposed")]
13    transposed: bool,
14}
15
16#[derive(Debug, serde::Deserialize)]
17pub enum DataLocation {
18    LocalFile(String),
19}
20
21pub fn default_transposed() -> bool {
22    false
23}
24
25impl TryFrom<GraphInfo> for GraphB {
26    type Error = io::Error;
27
28    fn try_from(value: GraphInfo) -> Result<Self, Self::Error> {
29        match value.location {
30            DataLocation::LocalFile(path) => {
31                let mut builder = ParseBuilder::new(File::open(path)?, DataFormat::EdgeList);
32                if value.directed {
33                    if value.transposed {
34                        builder = builder.transpose();
35                    }
36                    Ok(GraphB::Di(builder.parse::<DiGraphB>()?))
37                } else {
38                    Ok(GraphB::Ud(builder.parse::<UndiGraphB>()?))
39                }
40            }
41        }
42    }
43}