\documentclass[10pt,aspectratio=169]{beamer}

\usetheme[progressbar=frametitle]{metropolis}
\input{color_config.tex}
\usepackage{appendixnumberbeamer}
\usepackage{svg}
\usepackage{booktabs}
\usepackage{listings}
\usepackage[scale=2]{ccicons}

\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}

\usepackage{xspace}
\newcommand{\themename}{\textbf{\textsc{metropolis}}\xspace}

\makeatletter
\setbeamertemplate{frametitle}{%
  \nointerlineskip%
  \begin{beamercolorbox}[%
      wd=\paperwidth,%
      sep=0pt,%
      leftskip=\metropolis@frametitle@padding,%
      rightskip=\metropolis@frametitle@padding,%
    ]{frametitle}%
  \metropolis@frametitlestrut@start%
  \insertframetitle%
  \nolinebreak%
  \metropolis@frametitlestrut@end%
  \hfill
  \raisebox{-0.6ex}{\includegraphics[height=6ex,keepaspectratio]{logo-hadinet-darkmode.png}}
\end{beamercolorbox}%
}
\setbeamertemplate{title page}{
  \begin{minipage}[\paperheight]{\textwidth}
    \ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
    \ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
    \usebeamertemplate*{title separator}
    \begin{columns}
        \begin{column}{.6\textwidth}            
            \ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
            \ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
            \ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
            \vfill
        \end{column}
        \begin{column}{.3\textwidth}
            \vfill\hfill
            \includegraphics[height=.4\textheight,keepaspectratio]{logo-hadinet-darkmode.png}
        \end{column}
    \end{columns}
    \vfill
  \end{minipage}
}
\makeatother

\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{12} % for bold
\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{12}  % for normal
\usepackage{xcolor}
\definecolor{keyword}{RGB}{138, 172, 201}
\definecolor{class}{RGB}{205, 138, 196}
\definecolor{string}{RGB}{121, 189, 139}
\newcommand\pythonstyle{\lstset{
		language=Python,
		basicstyle=\ttm\small,
		morekeywords={self},              
		keywordstyle=\ttb\small\color{keyword},
		emph={StudentRoom,FastAPI},          
		emphstyle=\ttb\small\color{class},    
		stringstyle=\color{string},
		frame=tb,                         
		showstringspaces=false
}}

\title{Pydantic}
\subtitle{Favorite Tool for Data Validation in python}
% \date{\today}
\date{31.08.2023}
\author{Lewi}
\institute{}
% \titlegraphic{\hfill\includegraphics[height=1.5cm]{logo.pdf}}

\begin{document}

\maketitle
\begin{frame}{dataclasses}
	\begin{itemize}
		\item 
	\end{itemize}
\end{frame}
\begin{frame}{Why Pydantic}
    \begin{itemize}
        \item Encourages Usage of Type Hints
        \item Fast
        \item Autogenerates JSON Schema
        \item Complete custom validation
        \item Used in many other useful Frameworks
        \item Awesome Documentation
    \end{itemize}
\end{frame}
\begin{frame}[fragile]{Basics}
	\pythonstyle
	\begin{lstlisting}[language=Python]
	from pydantic import BaseModel
	
	class StudentRoom(BaseModel):
	  room_number: str
	  rent: int
	
	r = StudentRoom(room_number='a111', rent=250)
	print(r.room_number)
	# > a111
	r2 = StudentRoom(room_number='a111', rent=[250])
	# > Input should be a valid integer 
	# > [type=int_type, input_value=[250], input_type=list]
	\end{lstlisting}
\end{frame}
\begin{frame}{What to use it for?}
	\begin{itemize}
		\item Configuration Validation
		\item Data Modeling
		\item REST Validation
	\end{itemize}
\end{frame}
\begin{frame}[fragile]{JSON Schema}
	\pythonstyle
	\begin{lstlisting}[language=Python]
	StudentRoom.model_json_schema()
	# > {'properties': {
	# >     'room_number': {'title': 'Room Number', 'type': 'string'}, 
	# >	       'rent': {'title': 'Rent', 'type': 'integer'}
	# >    }, 
	# >  'required': ['room_number', 'rent'], 
	# >  'title': 'StudentRoom', 
	# >  'type': 'object'
	# > }
	\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{FastApi}
	\pythonstyle
	\begin{lstlisting}[language=Python]
		from typing import Union
		
		from fastapi import FastAPI
		
		app = FastAPI()
		
		
		@app.get("/")
		def read_root():
		return {"Hello": "World"}
		
		
		@app.get("/items/{item_id}")
		def read_item(item_id: int, q: Union[str, None] = None):
		return {"item_id": item_id, "q": q}
	\end{lstlisting}
\end{frame}
\end{document}
