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}