There are many ways to handle this. The approach I would most likely take can be illustrated by the following example:
f[seqn : ___] := Module[{args = {seqn}},
Switch[args,
{{___}}, "List of args",
{_}, "One arg",
{_, __}, "Two or more args",
{}, "No args"
]]
f[{x, y, z}]
(* ==> "List of args" *)
f[{x}]
(* ==> "List of args" *)
f[]
(* ==> "No args" *)
f[x]
(* ==> "One arg" *)
f[x, y, z]
(* ==> "Two or more args" *)
Of course, each application of this technique would replace the strings seen here with some action appropriate to its own needs.
Another approach is to write separate functions for each argument pattern you want to handle:
g[args : {___}] := "List of args"
g[] := "No args"
g[arg_] := "One arg"
g[arg_, rest__] := "Two or more args"
g[{x, y, z}]
(* ==> "List of args" *)
g[{x}]
(* ==> "List of args" *)
g[]
(* ==> "No args" *)
g[x]
(* ==> "One arg" *)
g[x, y, z]
(* ==> "Two or more args" *)
f[args___]:= f[{args}]
and then provide the definition forf[{arg1_, arg2_,...}]
. $\endgroup$