opencv_binding_generator/
version.rs1use std::fs::File;
2use std::io::BufReader;
3use std::ops::ControlFlow;
4use std::path::{Path, PathBuf};
5
6use semver::Version;
7
8use crate::line_reader;
9
10pub trait OpenCVHeaderVersionExt {
11 fn opencv_find_module_header_dir(&self) -> Option<PathBuf>;
12 fn opencv_find_version_header(&self) -> Option<PathBuf>;
13 fn opencv_find_version(&self) -> Option<Version>;
14}
15
16impl OpenCVHeaderVersionExt for Path {
17 fn opencv_find_module_header_dir(&self) -> Option<PathBuf> {
18 let mut out = self.join("opencv2.framework/Headers");
19 if out.is_dir() {
20 return Some(out);
21 }
22 out = self.join("opencv2");
23 if out.is_dir() {
24 return Some(out);
25 }
26 None
27 }
28
29 fn opencv_find_version_header(&self) -> Option<PathBuf> {
30 self
31 .opencv_find_module_header_dir()
32 .map(|dir| dir.join("core/version.hpp"))
33 .filter(|hdr| hdr.is_file())
34 }
35
36 fn opencv_find_version(&self) -> Option<Version> {
37 let version_hpp = self.opencv_find_version_header()?;
38 let mut major = None;
39 let mut minor = None;
40 let mut revision = None;
41 let reader = BufReader::new(File::open(version_hpp).ok()?);
42 line_reader(reader, |line| {
43 if let Some(line) = line.strip_prefix("#define CV_VERSION_") {
44 let mut parts = line.split_whitespace();
45 if let Some(ver_spec) = parts.next()
46 && let Some(version) = parts.next()
47 {
48 match ver_spec {
49 "MAJOR" => major = version.parse().ok(),
50 "MINOR" => minor = version.parse().ok(),
51 "REVISION" => revision = version.parse().ok(),
52 _ => {}
53 }
54 }
55 if major.is_some() && minor.is_some() && revision.is_some() {
56 return ControlFlow::Break(());
57 }
58 }
59 ControlFlow::Continue(())
60 });
61 if let Some(major) = major
62 && let Some(minor) = minor
63 && let Some(revision) = revision
64 {
65 Some(Version::new(major, minor, revision))
66 } else {
67 None
68 }
69 }
70}
71
72pub trait OpenCVVersionExt {
73 fn is_opencv_5(&self) -> bool;
74}
75
76impl OpenCVVersionExt for Version {
77 fn is_opencv_5(&self) -> bool {
78 self.major == 5
79 }
80}