Iftheactionisanupdateordestroy,itwilltakearecordorachangesetasits*first*argument.Iftheactionisareadaction,itwilltakeastartingqueryasan*optinthelast*argument.Allfunctionswillhaveanoptionallastargumentthatacceptsoptions.Thoseoptionsare:#{Spark.OptionsHelpers.docs(Ash.Resource.Interface.interface_options(nil))}Forreads:*`:query`-aquerytostarttheactionwith,canbeusedtofilter/sorttheresultsoftheaction.Forcreates:*`:changeset`-achangesettostarttheactionwithTheywillalsohaveanoptionalsecondtolastargumentthatisafreeformmaptoprovideactioninput.It*mustbeamap*.Ifitisakeywordlist,itwillbeassumedthatitisactually`options`(forconvenience).Thisallowsforthefollowingbehaviour:```elixir# Because the 3rd argument is a keyword list, we use it as optionsApi.register_user(username,password,[tenant:"organization_22"])# Because the 3rd argument is a keyword list, we use it as action inputApi.register_user(username,password,%{key:"val"})# When all are provided it is unambiguousApi.register_user(username,password,%{key:"val"},[tenant:"organization_22"])```## get?Onlyrelevantforreadactions.Expectstoonlyreceiveasingleresultfromareadaction.Theactionshouldreturnasingleresultbasedonanyargumentsprovided.Tomakeitsothatthefunctiontakesaspecificfield,andfiltersonthatfield,use`get_by`instead.Usefulforcreatingfunctionslike`get_user_by_email`thatmaptoanactionthathasan`:email`argument.## get_byAutomaticallysets`get?`to`true`.Theactionshouldreturnasingleresultbasedonanyargumentsprovided.Tomakeitsothatthefunctiontakesaspecificfield,andfiltersonthatfield,use`get_by`instead.Whencombined,`get_by`takesprecedence.Usefulforcreatingfunctionslike`get_user_by_id`thatmaptoabasicreadaction.## get_by_identity