| 148 | } |
| 149 | #[args(py_kwargs = "**")] |
| 150 | pub fn parse_events( |
| 151 | &self, |
| 152 | py: Python<'_>, |
| 153 | event_name: String, |
| 154 | py_kwargs: Option<&PyDict>, |
| 155 | ) -> PyResult<Py<PyAny>> { |
| 156 | let (rounds, wanted_props) = parse_kwargs_event(py_kwargs); |
| 157 | let real_props = rm_user_friendly_names(&wanted_props); |
| 158 | let unk_props = check_validity_props(&real_props); |
| 159 | if !unk_props.is_empty() { |
| 160 | return Err(PyKeyError::new_err(format!( |
| 161 | "Unknown fields: {:?}", |
| 162 | unk_props |
| 163 | ))); |
| 164 | } |
| 165 | let parse_props = !wanted_props.is_empty() || rounds; |
| 166 | let parser = Demo::new( |
| 167 | self.path.clone(), |
| 168 | parse_props, |
| 169 | vec![], |
| 170 | vec![], |
| 171 | real_props, |
| 172 | event_name, |
| 173 | false, |
| 174 | false, |
| 175 | false, |
| 176 | 9999999, |
| 177 | wanted_props, |
| 178 | ); |
| 179 | match parser { |
| 180 | Err(e) => Err(PyFileNotFoundError::new_err(format!( |
| 181 | "Couldnt read demo file. Error: {}", |
| 182 | e |
| 183 | ))), |
| 184 | Ok(mut parser) => { |
| 185 | let _: Header = parser.parse_demo_header(); |
| 186 | |
| 187 | let _ = parser.start_parsing(&vec!["m_iMVPs".to_owned()]); |
| 188 | let mut game_evs: Vec<FxHashMap<String, PyObject>> = Vec::new(); |
| 189 | |
| 190 | // Create Hashmap with <string, pyobject> to be able to convert to python dict |
| 191 | for ge in parser.game_events { |
| 192 | let mut hm: FxHashMap<String, PyObject> = FxHashMap::default(); |
| 193 | let tuples = ge.to_py_tuples(py); |
| 194 | for (k, v) in tuples { |
| 195 | hm.insert(k, v); |
| 196 | } |
| 197 | game_evs.push(hm); |
| 198 | } |
| 199 | let dict = pyo3::Python::with_gil(|py| game_evs.to_object(py)); |
| 200 | Ok(dict) |
| 201 | } |
| 202 | } |
| 203 | } |
| 204 | |
| 205 | #[args(py_kwargs = "**")] |
| 206 | pub fn parse_ticks( |