use winnow::ModalResult as PResult;
use winnow::combinator::alt;
use winnow::prelude::*;
use crate::parser::{ParsedField, Stream};
pub mod amqp;
pub mod bacnet;
pub mod coap;
pub mod dhcp;
pub mod dnp3;
pub mod dns;
pub mod ethernetip;
pub mod ftp;
pub mod grpc;
pub mod http;
pub mod http2;
pub mod imap;
pub mod ipfix;
pub mod kerberos;
pub mod ldap;
pub mod mdns;
pub mod memcached;
pub mod modbus;
pub mod mqtt;
pub mod mysql;
pub mod netflow;
pub mod nfs;
pub mod ntp;
pub mod opcua;
pub mod pop3;
pub mod postgres;
pub mod ptp;
pub mod quic;
pub mod radius;
pub mod redis;
pub mod rtp;
pub mod rtsp;
pub mod s7comm;
pub mod sflow;
pub mod sip;
pub mod smb;
pub mod smtp;
pub mod snmp;
pub mod ssdp;
pub mod ssh;
pub mod stun;
pub mod syslog;
pub mod tacacs;
pub mod telnet;
pub mod tftp;
pub mod tls;
pub mod websocket;
pub mod whois;
pub(crate) use amqp::*;
pub(crate) use bacnet::*;
pub(crate) use coap::*;
pub(crate) use dhcp::*;
pub(crate) use dnp3::*;
pub(crate) use dns::*;
pub(crate) use ethernetip::*;
pub(crate) use ftp::*;
pub(crate) use grpc::*;
pub(crate) use http::*;
pub(crate) use http2::*;
pub(crate) use imap::*;
pub(crate) use ipfix::*;
pub(crate) use kerberos::*;
pub(crate) use ldap::*;
pub(crate) use mdns::*;
pub(crate) use memcached::*;
pub(crate) use modbus::*;
pub(crate) use mqtt::*;
pub(crate) use mysql::*;
pub(crate) use netflow::*;
pub(crate) use nfs::*;
pub(crate) use ntp::*;
pub(crate) use opcua::*;
pub(crate) use pop3::*;
pub(crate) use postgres::*;
pub(crate) use ptp::*;
pub(crate) use quic::*;
pub(crate) use radius::*;
pub(crate) use redis::*;
pub(crate) use rtp::*;
pub(crate) use rtsp::*;
pub(crate) use s7comm::*;
pub(crate) use sflow::*;
pub(crate) use sip::*;
pub(crate) use smb::*;
pub(crate) use smtp::*;
pub(crate) use snmp::*;
pub(crate) use ssdp::*;
pub(crate) use ssh::*;
pub(crate) use stun::*;
pub(crate) use syslog::*;
pub(crate) use tacacs::*;
pub(crate) use telnet::*;
pub(crate) use tftp::*;
pub(crate) use tls::*;
pub(crate) use websocket::*;
pub(crate) use whois::*;
pub(crate) fn parse_l7_field<'i, 'a>(input: &mut Stream<'i, 'a>) -> PResult<ParsedField<'a>> {
alt((
alt((
parse_amqp_field,
parse_bacnet_field,
parse_coap_field,
parse_dhcp_field,
parse_dnp3_field,
parse_dns_field,
parse_ethernetip_field,
parse_ftp_field,
)),
alt((
parse_grpc_field,
parse_http_field,
parse_http2_field,
parse_imap_field,
parse_ipfix_field,
parse_kerberos_field,
parse_ldap_field,
parse_mdns_field,
)),
alt((
parse_memcached_field,
parse_modbus_field,
parse_mqtt_field,
parse_mysql_field,
parse_netflow_field,
parse_nfs_field,
parse_ntp_field,
parse_opcua_field,
)),
alt((
parse_pop3_field,
parse_postgres_field,
parse_ptp_field,
parse_quic_field,
parse_radius_field,
parse_redis_field,
parse_rtp_field,
parse_rtsp_field,
)),
alt((
parse_s7comm_field,
parse_sflow_field,
parse_sip_field,
parse_smb_field,
parse_smtp_field,
parse_snmp_field,
parse_ssdp_field,
parse_ssh_field,
)),
alt((
parse_stun_field,
parse_syslog_field,
parse_tacacs_field,
parse_telnet_field,
parse_tftp_field,
parse_tls_field,
parse_websocket_field,
parse_whois_field,
)),
))
.parse_next(input)
}