use std::fmt; use crate::protobuf_abs_path::ProtobufAbsPath; use crate::protobuf_rel_path::ProtobufRelPath; /// Protobuf identifier can be absolute or relative. #[derive(Debug, Eq, PartialEq, Clone, Hash)] pub(crate) enum ProtobufPath { Abs(ProtobufAbsPath), Rel(ProtobufRelPath), } impl ProtobufPath { pub fn new>(path: S) -> ProtobufPath { let path = path.into(); if path.starts_with('.') { ProtobufPath::Abs(ProtobufAbsPath::new(path)) } else { ProtobufPath::Rel(ProtobufRelPath::new(path)) } } pub fn _resolve(&self, package: &ProtobufAbsPath) -> ProtobufAbsPath { match self { ProtobufPath::Abs(p) => p.clone(), ProtobufPath::Rel(p) => { let mut package = package.clone(); package.push_relative(p); package } } } } impl fmt::Display for ProtobufPath { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ProtobufPath::Abs(p) => write!(f, "{}", p), ProtobufPath::Rel(p) => write!(f, "{}", p), } } }