# 🐍 Architecture / Codebase Overview
A very vague representation of how an ideal pyscan run works with no arguments given.
Pyscan is coded in a psuedo-procedural manner where the top level works just like any procedural program (the functions are "chained" in a way) but the internals use structs and models/classes to an extent enough to call it OOP. It's a mix of both worlds.
## Important files to look at
There's comments on almost anything comment-able and worthy. Feel free to look around.
- [`parser.rs`](../src/parser/mod.rs) - top level look at the parser. Check out [`extractor.rs`](../src/parser/extractor.rs) to really see the extraction and file discovery being done.
- [`scanner::api.rs`](../src/scanner/api.rs) - how the API stuff gets done using the struct `Osv`, look at `mod.rs` for a higher level view.
- [`docker.rs`](../src/docker/mod.rs) - handles getting and doing stuff with Docker.
- [`display.rs`](../src/display/mod.rs) - some functions used to print to the screen, not all though.
## Notes for contributers
- This thing will be updated every once in a while to detail how pyscan works in a much more articulate and better way, including subcommands and other arguments and quirks.
- If you think the codebase is designed badly, I don't know, it might be. I have never made a CLI tool before so, there's that. Open an issue or make a PR and I'm more than willing to learn from you.
- Please be descriptive and detailed in your PRs, comments and other decent things. It's very cool what the open source community has done for pyscan so far.