--- /dev/null
+<?php
+
+namespace Drush\User;
+
+class UserList {
+
+ /** @var \Drush\User\UserSingleBase[] */
+ public $accounts;
+
+ /**
+ * Finds a list of user objects based on Drush arguments,
+ * or options.
+ */
+ public function __construct($inputs) {
+ if ($this->accounts = $this->getFromOptions() + $this->getFromParameters($inputs)) {
+ return $this;
+ }
+ else {
+ throw new UserListException('Unable to find a matching user.');
+ }
+ }
+
+ /**
+ * Iterate over each account and call the specified method.
+ *
+ * @param $method
+ * A method on a UserSingleBase object.
+ * @param array $params
+ * An array of params to pass to the method.
+ * @return array
+ * An associate array of values keyed by account ID.
+ */
+ public function each($method, array $params = array()) {
+ foreach ($this->accounts as $account) {
+ $return[$account->id()] = call_user_func_array(array($account, $method), $params);
+ }
+ return $return;
+ }
+
+ /*
+ * Check common options for specifying users. If valid, return the accounts.
+ *
+ * @return \Drush\User\UserSingleBase[]
+ */
+ function getFromOptions() {
+ $accounts = array();
+ $userversion = drush_user_get_class();
+ if ($mails = _convert_csv_to_array(drush_get_option('mail'))) {
+ foreach ($mails as $mail) {
+ if ($account = $userversion->load_by_mail($mail)) {
+ $single = drush_usersingle_get_class($account);
+ $accounts[$single->id()] = $single;
+ }
+ else {
+ throw new UserListException('Unable to find a matching user for ' . $mail . '.');
+ }
+ }
+ }
+ if ($names = _convert_csv_to_array(drush_get_option('name'))) {
+ foreach ($names as $name) {
+ if ($account = $userversion->load_by_name($name)) {
+ $single = drush_usersingle_get_class($account);
+ $accounts[$single->id()] = $single;
+ }
+ else {
+ throw new UserListException('Unable to find a matching user for ' . $name . '.');
+ }
+ }
+ }
+ if ($userids = _convert_csv_to_array(drush_get_option('uid'))) {
+ foreach ($userids as $userid) {
+ if (is_numeric($userid) && $account = $userversion->load_by_uid($userid)) {
+ $single = drush_usersingle_get_class($account);
+ $accounts[$single->id()] = $single;
+ }
+ else {
+ throw new UserListException('Unable to find a matching user for ' . $userid . '.');
+ }
+ }
+ }
+ return $accounts;
+ }
+
+ /**
+ * Given a comma-separated list of inputs, return accounts
+ * for users that match by uid,name or email address.
+ *
+ * @param string $inputs
+ * A comma delimited string (or array) of arguments, specifying user account(s).
+ *
+ * @throws UserListException
+ * If any input is unmatched, an exception is thrown.
+ *
+ * @return \Drush\User\UserSingleBase[]
+ * An associative array of UserSingleBase objects, keyed by user id.
+ */
+ public static function getFromParameters($inputs) {
+ $accounts = array();
+ $userversion = drush_user_get_class();
+ if ($inputs && $userversion) {
+ $inputs = _convert_csv_to_array($inputs);
+ foreach($inputs as $input) {
+ if (is_numeric($input) && $account = $userversion->load_by_uid($input)) {
+
+ }
+ elseif ($account = $userversion->load_by_name($input)) {
+
+ }
+ elseif ($account = $userversion->load_by_mail($input)) {
+
+ }
+ else {
+ // Unable to load an account for the input.
+ throw new UserListException('Unable to find a matching user for ' . $input . '.');
+ }
+ // Populate $accounts with a UserSingle object. Will go into $this->accounts.
+ $single = drush_usersingle_get_class($account);
+ $accounts[$single->id()] = $single;
+ }
+ }
+ return $accounts;
+ }
+
+ /*
+ * A comma delimited list of names built from $this->accounts.
+ */
+ public function names() {
+ $names = array();
+ foreach ($this->accounts as $account) {
+ $names[] = $account->getUsername();
+ }
+ return implode(', ', $names);
+ }
+}